准备

模型及映射文件

  1. package com.zze.bean;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. public class Class {
  7. public Class() {
  8. }
  9.  
  10. public Class(Integer id, String name) {
  11. this.id = id;
  12. this.name = name;
  13. }
  14.  
  15. private Integer id;
  16. private String name;
  17.  
  18. private Set<Student> students = new HashSet<>();
  19.  
  20. public Integer getId() {
  21. return id;
  22. }
  23.  
  24. public void setId(Integer id) {
  25. this.id = id;
  26. }
  27.  
  28. public String getName() {
  29. return name;
  30. }
  31.  
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35.  
  36. public Set<Student> getStudents() {
  37. return students;
  38. }
  39.  
  40. public void setStudents(Set<Student> students) {
  41. this.students = students;
  42. }
  43.  
  44. @Override
  45. public String toString() {
  46. return "Class{" +
  47. "id=" + id +
  48. ", name='" + name + '\'' +
  49. '}';
  50. }
  51. }

班级模型:com.zze.bean.Class

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping>
  7. <class name="com.zze.bean.Class" table="class">
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11. <property name="name" length="32"/>
  12. <set name="students" cascade="save-update">
  13. <key column="cid"/>
  14. <one-to-many class="com.zze.bean.Student"/>
  15. </set>
  16. </class>
  17. </hibernate-mapping>

班级映射:com/zze/bean/Class.hbm.xml

  1. package com.zze.bean;
  2.  
  3. import java.util.Date;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6.  
  7. public class Student {
  8. public Student() {
  9. }
  10.  
  11. public Student(Integer id, String name, Integer age,String gender) {
  12. this.id = id;
  13. this.name = name;
  14. this.age = age;
  15. this.gender = gender;
  16. }
  17.  
  18. private Integer id;
  19. private String name;
  20. private Integer age;
  21. private String gender;
  22.  
  23. private Class clazz;
  24.  
  25. public Integer getId() {
  26. return id;
  27. }
  28.  
  29. public void setId(Integer id) {
  30. this.id = id;
  31. }
  32.  
  33. public String getName() {
  34. return name;
  35. }
  36.  
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40.  
  41. public Integer getAge() {
  42. return age;
  43. }
  44.  
  45. public void setAge(Integer age) {
  46. this.age = age;
  47. }
  48.  
  49. public String getGender() {
  50. return gender;
  51. }
  52.  
  53. public void setGender(String gender) {
  54. this.gender = gender;
  55. }
  56.  
  57. public Class getClazz() {
  58. return clazz;
  59. }
  60.  
  61. public void setClazz(Class clazz) {
  62. this.clazz = clazz;
  63. }
  64.  
  65. @Override
  66. public String toString() {
  67. return "Student{" +
  68. "id=" + id +
  69. ", name='" + name + '\'' +
  70. '}';
  71. }
  72. }

学生模型:com.zze.bean.Student

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping>
  7. <class name="com.zze.bean.Student" table="student">
  8. <id name="id">
  9. <generator class="native"/>
  10. </id>
  11. <property name="name" length="32"/>
  12. <property name="age"/>
  13. <property name="gender"/>
  14. <many-to-one name="clazz" column="cid" class="com.zze.bean.Class"/>
  15. </class>
  16. </hibernate-mapping>

学生映射:com/zze/bean/Student.hbm.xml

全局配置

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8. <property name="hibernate.connection.url">jdbc:mysql://192.168.208.153:3306/1221</property>
  9. <property name="hibernate.connection.username">root</property>
  10. <property name="hibernate.connection.password">root</property>
  11. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  12. <property name="hibernate.show_sql">true</property>
  13. <property name="hibernate.format_sql">true</property>
  14. <property name="current_session_context_class">thread</property>
  15. <property name="hibernate.hbm2ddl.auto">create</property>
  16. <mapping resource="com/zze/bean/Class.hbm.xml"></mapping>
  17. <mapping resource="com/zze/bean/Student.hbm.xml"></mapping>
  18. </session-factory>
  19. </hibernate-configuration>

hibernate.cfg.xml

工具类

  1. package com.zze.util;
  2.  
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.cfg.Configuration;
  6.  
  7. public class HibernateUtil {
  8. public static final Configuration cfg;
  9. public static final SessionFactory sf;
  10.  
  11. static {
  12. cfg = new Configuration().configure();
  13. sf = cfg.buildSessionFactory();
  14. }
  15.  
  16. public static Session openSession() {
  17. return sf.openSession();
  18. }
  19.  
  20. public static Session getCurrentSession() {
  21. return sf.getCurrentSession();
  22. }
  23. }

com.zze.util.HibernateUtil

初始化数据

  1. @Test
  2. public void initData(){
  3. Session session = HibernateUtil.getCurrentSession();
  4. Transaction transaction = session.beginTransaction();
  5. Class clazz1 = new Class(null,"软件一班");
  6. Class clazz2 = new Class(null,"软件二班");
  7. Class clazz3 = new Class(null,"汽修一班");
  8. Class clazz4 = new Class(null,"汽修二班");
  9.  
  10. Student student1 = new Student(null, "张三", 12,"男");
  11. Student student2 = new Student(null, "李四", 13,"女");
  12. Student student3 = new Student(null, "王五", 14,"男");
  13. Student student4 = new Student(null, "赵六", 15,"男");
  14. Student student5 = new Student(null, "吴刚", 39,"男");
  15. Student student6 = new Student(null, "王如花", 30,"女");
  16. Student student7 = new Student(null, "李志静", 49,"女");
  17. Student student8 = new Student(null, "何王天", 30,"男");
  18.  
  19. clazz1.getStudents().add(student1);
  20. clazz1.getStudents().add(student2);
  21. clazz2.getStudents().add(student3);
  22. clazz2.getStudents().add(student4);
  23. clazz3.getStudents().add(student5);
  24. clazz3.getStudents().add(student6);
  25. clazz4.getStudents().add(student7);
  26. clazz4.getStudents().add(student8);
  27.  
  28. session.save(clazz1);
  29. session.save(clazz2);
  30. session.save(clazz3);
  31. session.save(clazz4);
  32. transaction.commit();
  33. }

init data

几种检索方式

OID检索

  • 简介

    Hibernate 根据对象的 OID(主键)进行检索。

  • 示例

    1. @Test
    2. public void test1(){
    3. Session session = HibernateUtil.getCurrentSession();
    4. Transaction transaction = session.beginTransaction();
    5. Class clazz = session.get(Class.class, 1);
    6. System.out.println(clazz);
    7. transaction.commit();
    8. /*
    9. Hibernate:
    10. select
    11. class0_.id as id1_0_0_,
    12. class0_.name as name2_0_0_
    13. from
    14. class class0_
    15. where
    16. class0_.id=?
    17. Class{id=1, name='软件一班'}
    18. */
    19. }

    例 1:使用 get 方法

    1. @Test
    2. public void test2() {
    3. Session session = HibernateUtil.getCurrentSession();
    4. Transaction transaction = session.beginTransaction();
    5. Class clazz = session.load(Class.class, 1);
    6. System.out.println(clazz);
    7. transaction.commit();
    8. /*
    9. Hibernate:
    10. select
    11. class0_.id as id1_0_0_,
    12. class0_.name as name2_0_0_
    13. from
    14. class class0_
    15. where
    16. class0_.id=?
    17. Class{id=1, name='软件一班'}
    18. */
    19. }

    例 2:使用 load 方法

对象导航检索

  • 简介

    Hibernate 根据一个已经查询到的对象,获得其关联的对象的一种查询方式。

  • 示例

    1. @Test
    2. public void test3(){
    3. Session session = HibernateUtil.getCurrentSession();
    4. Transaction transaction = session.beginTransaction();
    5. Class clazz = session.load(Class.class, 1);
    6. System.out.println(clazz);
    7. System.out.println(Arrays.toString(clazz.getStudents().toArray()));
    8. transaction.commit();
    9. /*
    10. Hibernate:
    11. select
    12. class0_.id as id1_0_0_,
    13. class0_.name as name2_0_0_
    14. from
    15. class class0_
    16. where
    17. class0_.id=?
    18. Class{id=1, name='软件一班'}
    19. Hibernate:
    20. select
    21. students0_.cid as cid5_1_0_,
    22. students0_.id as id1_1_0_,
    23. students0_.id as id1_1_1_,
    24. students0_.name as name2_1_1_,
    25. students0_.age as age3_1_1_,
    26. students0_.gender as gender4_1_1_,
    27. students0_.cid as cid5_1_1_
    28. from
    29. student students0_
    30. where
    31. students0_.cid=?
    32. [Student{id=2, name='张三'}, Student{id=1, name='李四'}]
    33. */
    34. }

    例 3:

HQL检索

  • 简介

    Hibernate Language Query,Hibernate 本身提供语法支持的一种检索方式。

  • 示例

    1. /**
    2. * 查询所有班级
    3. */
    4. @Test
    5. public void test4(){
    6. Session session = HibernateUtil.getCurrentSession();
    7. Transaction transaction = session.beginTransaction();
    8. String hql ="from Class";
    9. Query query = session.createQuery(hql);
    10. List<Class> list = query.list();
    11. System.out.println(list);
    12. transaction.commit();
    13. /*
    14. Hibernate:
    15. select
    16. class0_.id as id1_0_,
    17. class0_.name as name2_0_
    18. from
    19. class class0_
    20. [Class{id=1, name='软件一班'}, Class{id=2, name='软件二班'}, Class{id=3, name='汽修一班'}, Class{id=4, name='汽修二班'}]
    21. */
    22. }

    例 4:简单查询

    1. @Test
    2. public void test5(){
    3. Session session = HibernateUtil.getCurrentSession();
    4. Transaction transaction = session.beginTransaction();
    5. String hql ="select c from Class c";
    6. Query query = session.createQuery(hql);
    7. List<Class> list = query.list();
    8. System.out.println(list);
    9. transaction.commit();
    10. /*
    11. Hibernate:
    12. select
    13. class0_.id as id1_0_,
    14. class0_.name as name2_0_
    15. from
    16. class class0_
    17. [Class{id=1, name='软件一班'}, Class{id=2, name='软件二班'}, Class{id=3, name='汽修一班'}, Class{id=4, name='汽修二班'}]
    18. */
    19. }

    例 5:别名查询

    1. /**
    2. * 根据年龄排序
    3. */
    4. @Test
    5. public void test6(){
    6. Session session = HibernateUtil.getCurrentSession();
    7. Transaction transaction = session.beginTransaction();
    8. // 升序
    9. String hql = "from Student order by age";
    10. // 降序
    11. // String hql = "from Student order by age desc";
    12. Query query = session.createQuery(hql);
    13. List<Class> list = query.list();
    14. System.out.println(list);
    15. transaction.commit();
    16. /*
    17. Hibernate:
    18. select
    19. student0_.id as id1_1_,
    20. student0_.name as name2_1_,
    21. student0_.age as age3_1_,
    22. student0_.gender as gender4_1_,
    23. student0_.cid as cid5_1_
    24. from
    25. student student0_
    26. order by
    27. student0_.age
    28. [Student{id=2, name='张三'}, Student{id=1, name='李四'}, Student{id=3, name='王五'}, Student{id=4, name='赵六'}, Student{id=6, name='王如花'}, Student{id=8, name='何王天'}, Student{id=5, name='吴刚'}, Student{id=7, name='李志静'}]
    29. */
    30. }

    例 6:排序查询

    1. /**
    2. * 一个条件,查询 name='张三' 的 Student
    3. * 参数按位置绑定
    4. */
    5. @Test
    6. public void test7() {
    7. Session session = HibernateUtil.getCurrentSession();
    8. Transaction transaction = session.beginTransaction();
    9. String hql = "from Student where name = ?";
    10. Query query = session.createQuery(hql);
    11. query.setParameter(0, "张三");
    12. List<Student> list = query.list();
    13. System.out.println(list);
    14. transaction.commit();
    15. /*
    16. Hibernate:
    17. select
    18. student0_.id as id1_1_,
    19. student0_.name as name2_1_,
    20. student0_.age as age3_1_,
    21. student0_.gender as gender4_1_,
    22. student0_.cid as cid5_1_
    23. from
    24. student student0_
    25. where
    26. student0_.name=?
    27. [Student{id=2, name='张三'}]
    28. */
    29. }
    30.  
    31. /**
    32. * 多个条件 查询 name 中包含 '王' 且 age 大于 18 的Student
    33. * 参数按名称绑定
    34. */
    35. @Test
    36. public void test8() {
    37. Session session = HibernateUtil.getCurrentSession();
    38. Transaction transaction = session.beginTransaction();
    39. String hql = "from Student where name like :name and age>:age";
    40. Query query = session.createQuery(hql);
    41. query.setParameter("name", "%王%");
    42. query.setParameter("age", 18);
    43. List<Student> list = query.list();
    44. System.out.println(list);
    45. transaction.commit();
    46. /*
    47. Hibernate:
    48. select
    49. student0_.id as id1_1_,
    50. student0_.name as name2_1_,
    51. student0_.age as age3_1_,
    52. student0_.gender as gender4_1_,
    53. student0_.cid as cid5_1_
    54. from
    55. student student0_
    56. where
    57. (
    58. student0_.name like ?
    59. )
    60. and student0_.age>?
    61. [Student{id=6, name='王如花'}, Student{id=8, name='何王天'}]
    62. */
    63. }

    例 7:条件查询

    1. /**
    2. * 查询单个属性 返回 Object List
    3. */
    4. @Test
    5. public void test9() {
    6. Session session = HibernateUtil.getCurrentSession();
    7. Transaction transaction = session.beginTransaction();
    8. String hql = "select s.name from Student s";
    9. Query query = session.createQuery(hql);
    10. List<Object> list = query.list();
    11. System.out.println(list);
    12. transaction.commit();
    13. /*
    14. Hibernate:
    15. select
    16. student0_.name as col_0_0_
    17. from
    18. student student0_
    19. [李四, 张三, 王五, 赵六, 吴刚, 王如花, 李志静, 何王天]
    20. */
    21. }
    22.  
    23. /**
    24. * 查询多个属性 返回 Object[] List
    25. */
    26. @Test
    27. public void test10() {
    28. Session session = HibernateUtil.getCurrentSession();
    29. Transaction transaction = session.beginTransaction();
    30. String hql = "select s.name,s.age from Student s";
    31. Query query = session.createQuery(hql);
    32. List<Object[]> list = query.list();
    33. for (Object[] objects : list) {
    34. System.out.println(Arrays.toString(objects));
    35. }
    36. transaction.commit();
    37. /*
    38. Hibernate:
    39. select
    40. student0_.name as col_0_0_,
    41. student0_.age as col_1_0_
    42. from
    43. student student0_
    44. [李四, 13]
    45. [张三, 12]
    46. [王五, 14]
    47. [赵六, 15]
    48. [吴刚, 39]
    49. [王如花, 30]
    50. [李志静, 49]
    51. [何王天, 30]
    52. */
    53. }
    54.  
    55. /**
    56. * 查询多个属性 返回对应对象类型 List
    57. */
    58. @Test
    59. public void test11() {
    60. Session session = HibernateUtil.getCurrentSession();
    61. Transaction transaction = session.beginTransaction();
    62. /*
    63. 需要让模型提供对应构造:
    64. public Student(String name, Integer age) {
    65. this.name = name;
    66. this.age = age;
    67. }
    68. */
    69. String hql = "select new Student(name,age) from Student";
    70. Query query = session.createQuery(hql);
    71. List<Student> list = query.list();
    72. System.out.println(list);
    73. transaction.commit();
    74. /*
    75. Hibernate:
    76. select
    77. student0_.name as col_0_0_,
    78. student0_.age as col_1_0_
    79. from
    80. student student0_
    81. [Student{id=null, name='李四'}, Student{id=null, name='张三'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=null, name='吴刚'}, Student{id=null, name='王如花'}, Student{id=null, name='李志静'}, Student{id=null, name='何王天'}]
    82. */
    83. }

    例 8:投影查询

    1. @Test
    2. public void test12() {
    3. Session session = HibernateUtil.getCurrentSession();
    4. Transaction transaction = session.beginTransaction();
    5. String hql = "from Student";
    6. Query query = session.createQuery(hql);
    7. query.setFirstResult(0); // 起始行索引
    8. query.setMaxResults(3); // 每页条数
    9. List<Student> list = query.list();
    10. System.out.println(list);
    11. transaction.commit();
    12. /*
    13. Hibernate:
    14. select
    15. student0_.id as id1_1_,
    16. student0_.name as name2_1_,
    17. student0_.age as age3_1_,
    18. student0_.gender as gender4_1_,
    19. student0_.cid as cid5_1_
    20. from
    21. student student0_ limit ?
    22. [Student{id=1, name='李四'}, Student{id=2, name='张三'}, Student{id=3, name='王五'}]
    23.  
    24. Process finished with exit code 0
    25. */
    26. }

    例 9:分页查询

    1. /**
    2. * 聚合查询
    3. */
    4. @Test
    5. public void test13() {
    6. Session session = HibernateUtil.getCurrentSession();
    7. Transaction transaction = session.beginTransaction();
    8. // 聚合函数使用 count max min avg sum
    9. String hql = "select count(1) from Student";
    10. Query query = session.createQuery(hql);
    11. Object o = query.uniqueResult();
    12. System.out.println(o.getClass());
    13. System.out.println(o);
    14. transaction.commit();
    15. /*
    16. Hibernate:
    17. select
    18. count(1) as col_0_0_
    19. from
    20. student student0_
    21. class java.lang.Long
    22. 8
    23. */
    24. }
    25.  
    26. /**
    27. * 分组查询 返回 Object[] List
    28. * 根据 gender 分组,查询每个 gender 的对应数据条数
    29. */
    30. @Test
    31. public void test14() {
    32. Session session = HibernateUtil.getCurrentSession();
    33. Transaction transaction = session.beginTransaction();
    34. String hql = "select gender,count(1) from Student group by gender";
    35. Query query = session.createQuery(hql);
    36. List<Object[]> list = query.list();
    37. for (Object[] objects : list) {
    38. System.out.println(Arrays.toString(objects));
    39. }
    40. transaction.commit();
    41. /*
    42. Hibernate:
    43. select
    44. student0_.gender as col_0_0_,
    45. count(1) as col_1_0_
    46. from
    47. student student0_
    48. group by
    49. student0_.gender
    50. [女, 3]
    51. [男, 5]
    52. */
    53. }

    例 10:聚合及分组统计查询

    1. @Test
    2. public void test23() {
    3. Session session = HibernateUtil.getCurrentSession();
    4. Transaction transaction = session.beginTransaction();
    5. String hql = "from Student c join c.clazz";
    6. Query query = session.createQuery(hql);
    7. List<Object[]> list = query.list();
    8. for (Object[] objects : list) {
    9. System.out.println(Arrays.toString(objects));
    10. }
    11. transaction.commit();
    12. /*
    13. Hibernate:
    14. select
    15. student0_.id as id1_1_0_,
    16. class1_.id as id1_0_1_,
    17. student0_.name as name2_1_0_,
    18. student0_.age as age3_1_0_,
    19. student0_.gender as gender4_1_0_,
    20. student0_.cid as cid5_1_0_,
    21. class1_.name as name2_0_1_
    22. from
    23. student student0_
    24. inner join
    25. class class1_
    26. on student0_.cid=class1_.id
    27. [Student{id=1, name='李四'}, Class{id=1, name='软件一班'}]
    28. [Student{id=2, name='张三'}, Class{id=1, name='软件一班'}]
    29. [Student{id=3, name='王五'}, Class{id=2, name='软件二班'}]
    30. [Student{id=4, name='赵六'}, Class{id=2, name='软件二班'}]
    31. [Student{id=5, name='吴刚'}, Class{id=3, name='汽修一班'}]
    32. [Student{id=6, name='王如花'}, Class{id=3, name='汽修一班'}]
    33. [Student{id=7, name='李志静'}, Class{id=4, name='汽修二班'}]
    34. [Student{id=8, name='何王天'}, Class{id=4, name='汽修二班'}]
    35. */
    36. }

    例 11:普通内连接

    1. /**
    2. * 查询所有学生及其班级
    3. */
    4. @Test
    5. public void test24() {
    6. /*
    7. 迫切内连接
    8. 其实就是在普通的内连接 inner join 后添加关键字 fetch
    9. 将关联表数据封装到查询对象的属性中
    10. */
    11. Session session = HibernateUtil.getCurrentSession();
    12. Transaction transaction = session.beginTransaction();
    13. String hql = "from Student c join fetch c.clazz";
    14. Query query = session.createQuery(hql);
    15. List<Student> list = query.list();
    16. for (Student student : list) {
    17. System.out.println(String.format("%s %s", student, student.getClazz()));
    18. }
    19. transaction.commit();
    20. /*
    21. Hibernate:
    22. select
    23. student0_.id as id1_1_0_,
    24. class1_.id as id1_0_1_,
    25. student0_.name as name2_1_0_,
    26. student0_.age as age3_1_0_,
    27. student0_.gender as gender4_1_0_,
    28. student0_.cid as cid5_1_0_,
    29. class1_.name as name2_0_1_
    30. from
    31. student student0_
    32. inner join
    33. class class1_
    34. on student0_.cid=class1_.id
    35. Student{id=1, name='李四'} Class{id=1, name='软件一班'}
    36. Student{id=2, name='张三'} Class{id=1, name='软件一班'}
    37. Student{id=3, name='王五'} Class{id=2, name='软件二班'}
    38. Student{id=4, name='赵六'} Class{id=2, name='软件二班'}
    39. Student{id=5, name='吴刚'} Class{id=3, name='汽修一班'}
    40. Student{id=6, name='王如花'} Class{id=3, name='汽修一班'}
    41. Student{id=7, name='李志静'} Class{id=4, name='汽修二班'}
    42. Student{id=8, name='何王天'} Class{id=4, name='汽修二班'}
    43. */
    44. }
    45.  
    46. /**
    47. * 查询所有班级及属于该班级的学生
    48. */
    49. @Test
    50. public void test25() {
    51. Session session = HibernateUtil.getCurrentSession();
    52. Transaction transaction = session.beginTransaction();
    53. String hql = "select distinct c from Class c join fetch c.students";
    54. Query query = session.createQuery(hql);
    55. List<Class> list = query.list();
    56. for (Class clazz : list) {
    57. System.out.println(String.format("%s %s", clazz, clazz.getStudents()));
    58. }
    59. transaction.commit();
    60. /*
    61. Class{id=1, name='软件一班'} [Student{id=2, name='张三'}, Student{id=1, name='李四'}]
    62. Class{id=2, name='软件二班'} [Student{id=4, name='赵六'}, Student{id=3, name='王五'}]
    63. Class{id=3, name='汽修一班'} [Student{id=5, name='吴刚'}, Student{id=6, name='王如花'}]
    64. Class{id=4, name='汽修二班'} [Student{id=7, name='李志静'}, Student{id=8, name='何王天'}]
    65. */
    66. }

    例 12:迫切内连接

QBC检索

  • 简介

    Query By Criteria,条件查询,是一种更加面向对象化的查询方式。

  • 示例

    1. @Test
    2. public void test15(){
    3. Session session = HibernateUtil.getCurrentSession();
    4. Transaction transaction = session.beginTransaction();
    5. Criteria criteria = session.createCriteria(Class.class);
    6. List<Class> list = criteria.list();
    7. System.out.println(list);
    8. transaction.commit();
    9. /*
    10. Hibernate:
    11. select
    12. this_.id as id1_0_0_,
    13. this_.name as name2_0_0_
    14. from
    15. class this_
    16. [Class{id=1, name='软件一班'}, Class{id=2, name='软件二班'}, Class{id=3, name='汽修一班'}, Class{id=4, name='汽修二班'}]
    17. */
    18. }

    例 13:简单查询

    1. @Test
    2. public void test16(){
    3. Session session = HibernateUtil.getCurrentSession();
    4. Transaction transaction = session.beginTransaction();
    5. Criteria criteria = session.createCriteria(Class.class);
    6. // 升序
    7. criteria.addOrder(Order.asc("id"));
    8. // 降序
    9. // criteria.addOrder(Order.desc("id"));
    10. List<Class> list = criteria.list();
    11. System.out.println(list);
    12. transaction.commit();
    13. /*
    14. Hibernate:
    15. select
    16. this_.id as id1_0_0_,
    17. this_.name as name2_0_0_
    18. from
    19. class this_
    20. order by
    21. this_.id asc
    22. [Class{id=1, name='软件一班'}, Class{id=2, name='软件二班'}, Class{id=3, name='汽修一班'}, Class{id=4, name='汽修二班'}]
    23. */
    24. }

    例 14:排序查询

    1. @Test
    2. public void test17() {
    3. Session session = HibernateUtil.getCurrentSession();
    4. Transaction transaction = session.beginTransaction();
    5. Criteria criteria = session.createCriteria(Student.class);
    6. criteria.setFirstResult(0); // 数据起始索引
    7. criteria.setMaxResults(2); // 每页数据条数
    8. List<Student> list = criteria.list();
    9. System.out.println(list);
    10. transaction.commit();
    11. /*
    12. Hibernate:
    13. select
    14. this_.id as id1_1_0_,
    15. this_.name as name2_1_0_,
    16. this_.age as age3_1_0_,
    17. this_.gender as gender4_1_0_,
    18. this_.cid as cid5_1_0_
    19. from
    20. student this_ limit ?
    21. [Student{id=1, name='李四'}, Student{id=2, name='张三'}]
    22. */
    23. }

    例 15:分页查询

    1. /**
    2. * 简单 and 条件查询
    3. * 查询 name 包含 '王' 且 age>10
    4. */
    5. @Test
    6. public void test18() {
    7. Session session = HibernateUtil.getCurrentSession();
    8. Transaction transaction = session.beginTransaction();
    9. Criteria criteria = session.createCriteria(Student.class);
    10. // 默认多个 criteria.add 的条件是用 and 连接
    11. criteria.add(Restrictions.like("name", "%王%"));
    12. criteria.add(Restrictions.gt("age", 10));
    13. List<Student> list = criteria.list();
    14. System.out.println(list);
    15. transaction.commit();
    16. /*
    17. Hibernate:
    18. select
    19. this_.id as id1_1_0_,
    20. this_.name as name2_1_0_,
    21. this_.age as age3_1_0_,
    22. this_.gender as gender4_1_0_,
    23. this_.cid as cid5_1_0_
    24. from
    25. student this_
    26. where
    27. this_.name like ?
    28. and this_.age>?
    29. [Student{id=3, name='王五'}, Student{id=6, name='王如花'}, Student{id=8, name='何王天'}]
    30. */
    31. }
    32.  
    33. /**
    34. * 简单 or 条件查询
    35. * 查询 name 包含 '王' 或 name 包含 '张'
    36. */
    37. @Test
    38. public void test19() {
    39. Session session = HibernateUtil.getCurrentSession();
    40. Transaction transaction = session.beginTransaction();
    41. Criteria criteria = session.createCriteria(Student.class);
    42. // or 条件可以通过 Restrictions.or 方法实现
    43. criteria.add(Restrictions.or(Restrictions.like("name", "%王%"), Restrictions.like("name", "%张%")));
    44. List<Student> list = criteria.list();
    45. System.out.println(list);
    46. transaction.commit();
    47.  
    48. /*
    49. Hibernate:
    50. select
    51. this_.id as id1_1_0_,
    52. this_.name as name2_1_0_,
    53. this_.age as age3_1_0_,
    54. this_.gender as gender4_1_0_,
    55. this_.cid as cid5_1_0_
    56. from
    57. student this_
    58. where
    59. (
    60. this_.name like ?
    61. or this_.name like ?
    62. )
    63. [Student{id=2, name='张三'}, Student{id=3, name='王五'}, Student{id=6, name='王如花'}, Student{id=8, name='何王天'}]
    64. */
    65. }
    66.  
    67. /**
    68. * 复杂 and 和 or 查询
    69. * 查询 (name 包含 '王' 且 age>10) 或 name 包含 '张'
    70. */
    71. @Test
    72. public void test20() {
    73. Session session = HibernateUtil.getCurrentSession();
    74. Transaction transaction = session.beginTransaction();
    75. Criteria criteria = session.createCriteria(Student.class);
    76. // 通过 conjunction.add 添加的条件是 and 连接
    77. Conjunction conjunction = Restrictions.conjunction();
    78. conjunction.add(Restrictions.like("name", "%王%"));
    79. conjunction.add(Restrictions.gt("age", 10));
    80. // 通过 disjunction.add 添加的条件是 or 连接
    81. Disjunction disjunction = Restrictions.disjunction();
    82. disjunction.add(conjunction);
    83. disjunction.add(Restrictions.like("name", "%张%"));
    84. criteria.add(disjunction);
    85. List<Student> list = criteria.list();
    86. System.out.println(list);
    87. transaction.commit();
    88. /*
    89. Hibernate:
    90. select
    91. this_.id as id1_1_0_,
    92. this_.name as name2_1_0_,
    93. this_.age as age3_1_0_,
    94. this_.gender as gender4_1_0_,
    95. this_.cid as cid5_1_0_
    96. from
    97. student this_
    98. where
    99. (
    100. (
    101. this_.name like ?
    102. and this_.age>?
    103. )
    104. or this_.name like ?
    105. )
    106. [Student{id=2, name='张三'}, Student{id=3, name='王五'}, Student{id=6, name='王如花'}, Student{id=8, name='何王天'}]
    107. */
    108. }

    例 16:条件查询

    1. /**
    2. * 聚合统计查询
    3. * 统计男女人数及最大年龄
    4. */
    5. @Test
    6. public void test21() {
    7. Session session = HibernateUtil.getCurrentSession();
    8. Transaction transaction = session.beginTransaction();
    9. Criteria criteria = session.createCriteria(Student.class);
    10. /*
    11. criteria :
    12. add : 普通条件,where
    13. addOrder : 排序
    14. setProjection : 聚合函数和 group by having
    15. */
    16. ProjectionList projectionList = Projections.projectionList();
    17. projectionList.add(Projections.groupProperty("gender"));
    18. projectionList.add(Projections.rowCount());
    19. projectionList.add(Projections.max("age"));
    20. criteria.setProjection(projectionList);
    21.  
    22. List<Object[]> list = criteria.list();
    23. for (Object[] objects : list) {
    24. System.out.println(Arrays.toString(objects));
    25. }
    26. transaction.commit();
    27. /*
    28. Hibernate:
    29. select
    30. this_.gender as y0_,
    31. count(*) as y1_,
    32. max(this_.age) as y2_
    33. from
    34. student this_
    35. group by
    36. this_.gender
    37. [女, 3, 49]
    38. [男, 5, 39]
    39. */
    40. }

    例 17:聚合及分组统计查询

    1. /**
    2. * 离线条件查询
    3. * 查询 name 包含 '一'
    4. */
    5. @Test
    6. public void test22(){
    7. DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Class.class);
    8. detachedCriteria.add(Restrictions.like("name", "%一%"));
    9. Session session = HibernateUtil.getCurrentSession();
    10. Transaction transaction = session.beginTransaction();
    11. Criteria criteria = detachedCriteria.getExecutableCriteria(session);
    12. List<Class> list = criteria.list();
    13. System.out.println(list);
    14. transaction.commit();
    15. /*
    16. Hibernate:
    17. select
    18. this_.id as id1_0_0_,
    19. this_.name as name2_0_0_
    20. from
    21. class this_
    22. where
    23. this_.name like ?
    24. [Class{id=1, name='软件一班'}, Class{id=3, name='汽修一班'}]
    25. */
    26. }

    例 18:离线条件查询

SQL检索

  • 简介

    Hibernate 支持的原生 SQL 查询。

  • 示例

    1. /**
    2. * 查询所有 Class,返回 Object[] List
    3. */
    4. @Test
    5. public void test26() {
    6. Session session = HibernateUtil.getCurrentSession();
    7. Transaction transaction = session.beginTransaction();
    8. String sql = "select * from class";
    9. SQLQuery sqlQuery = session.createSQLQuery(sql);
    10. List<Object[]> list = sqlQuery.list();
    11. for (Object[] objects : list) {
    12. System.out.println(Arrays.toString(objects));
    13. }
    14. transaction.commit();
    15. /*
    16. Hibernate:
    17. select
    18. *
    19. from
    20. class
    21. [1, 软件一班]
    22. [2, 软件二班]
    23. [3, 汽修一班]
    24. [4, 汽修二班]
    25. */
    26. }
    27.  
    28. /**
    29. * 查询所有 Class,返回 Class List
    30. */
    31. @Test
    32. public void test27() {
    33. Session session = HibernateUtil.getCurrentSession();
    34. Transaction transaction = session.beginTransaction();
    35. String sql = "select * from class";
    36. SQLQuery sqlQuery = session.createSQLQuery(sql);
    37. sqlQuery.addEntity(Class.class);
    38. List<Class> list = sqlQuery.list();
    39. for (Class clazz : list) {
    40. System.out.println(clazz);
    41. }
    42. transaction.commit();
    43. /*
    44. Hibernate:
    45. select
    46. *
    47. from
    48. class
    49. Class{id=1, name='软件一班'}
    50. Class{id=2, name='软件二班'}
    51. Class{id=3, name='汽修一班'}
    52. Class{id=4, name='汽修二班'}
    53. */
    54. }

    例 19:原生 SQL 查询

延迟加载

概述

只有真正使用对象的属性时才会发送 SQL 进行查询。如: session.load(Student.class,1); 。

分类

  • 类级别的延迟加载

    指的是查询某个类的对象时,针对这个类的对象是否使用延迟加载。

    除了修改 lazy="false" 这种方式,还可通过如下两种方式让 lazy 失效:

    1、将持久化类以 final 修饰。

    2、通过调用 Hibernate.initialize(proxy); 。

  • 关联级别的延迟加载

    指的是查询到某个对象后,再查询其关联的对象是否使用延迟加载。

示例

  1. /**
  2. * 懒加载
  3. * 修改映射文件 :
  4. * com/zze/bean/Class.hbm.xml :
  5. * <class name="com.zze.bean.Class" table="class" lazy="true">
  6. * lazy 默认为 true
  7. */
  8. @Test
  9. public void test27() {
  10. Session session = HibernateUtil.getCurrentSession();
  11. Transaction transaction = session.beginTransaction();
  12. Class clazz = session.load(Class.class, 1);
  13. System.out.println(clazz.getClass()); // class com.zze.bean.Class_$$_jvst718_0
  14. System.out.println(clazz); // 发出 SQL
  15. transaction.commit();
  16. }
  17.  
  18. /**
  19. * 立即加载
  20. * 修改映射文件 :
  21. * com/zze/bean/Class.hbm.xml :
  22. * <class name="com.zze.bean.Class" table="class" lazy="false">
  23. */
  24. @Test
  25. public void test28() {
  26. Session session = HibernateUtil.getCurrentSession();
  27. Transaction transaction = session.beginTransaction();
  28. Class clazz = session.load(Class.class, 1); // 发出 SQL
  29. System.out.println(clazz.getClass()); // class com.zze.bean.Class
  30. System.out.println(clazz);
  31. transaction.commit();
  32. }

例 20:类级别的延迟加载

  1. /**
  2. * 懒加载
  3. * 修改映射文件 :
  4. * com/zze/bean/Class.hbm.xml :
  5. * <set name="students" cascade="save-update" lazy="true">
  6. * lazy 默认为 true
  7. */
  8. @Test
  9. public void test29() {
  10. Session session = HibernateUtil.getCurrentSession();
  11. Transaction transaction = session.beginTransaction();
  12. Class clazz = session.get(Class.class, 1);
  13. Set<Student> students = clazz.getStudents();
  14. System.out.println(students); // 发出 SQL
  15. transaction.commit();
  16. }
  17.  
  18. /**
  19. * 即时加载
  20. * 修改映射文件 :
  21. * com/zze/bean/Class.hbm.xml :
  22. * <set name="students" cascade="save-update" lazy="false">
  23. */
  24. @Test
  25. public void test30() {
  26. Session session = HibernateUtil.getCurrentSession();
  27. Transaction transaction = session.beginTransaction();
  28. Class clazz = session.get(Class.class, 1);
  29. Set<Student> students = clazz.getStudents(); // 发出 SQL
  30. System.out.println(students);
  31. transaction.commit();
  32. }
  33.  
  34. /**
  35. * 懒加载
  36. * 修改映射文件 :
  37. * com/zze/bean/Student.hbm.xml :
  38. * <many-to-one name="clazz" lazy="proxy" column="cid" class="com.zze.bean.Class"/>
  39. * com/zze/bean/Class.hbm.xml :
  40. * <class name="com.zze.bean.Class" table="class" lazy="true">
  41. * <p>
  42. * proxy : 默认值,表示引用关联类的加载策略。
  43. */
  44. @Test
  45. public void test31() {
  46. Session session = HibernateUtil.getCurrentSession();
  47. Transaction transaction = session.beginTransaction();
  48. Student student = session.get(Student.class, 1);
  49. Class clazz = student.getClazz();
  50. System.out.println(clazz); // 发出 SQL
  51. transaction.commit();
  52. }
  53.  
  54. /**
  55. * 即时加载
  56. * 当关联类的 lazy="false" 时,无论当前类 many-to-one 标签上的 lazy 如何配置,都是即时加载。
  57. * 修改映射文件 :
  58. * com/zze/bean/Student.hbm.xml :
  59. * * <many-to-one name="clazz" lazy="proxy" column="cid" class="com.zze.
  60. * com/zze/bean/Class.hbm.xml :
  61. * * <class name="com.zze.bean.Class" table="class" lazy="false">
  62. * 或 :
  63. * com/zze/bean/Student.hbm.xml :
  64. * * <many-to-one name="clazz" lazy="false" column="cid" class="com.zze.bean.Class"/>
  65. * com/zze/bean/Class.hbm.xml :
  66. * * <class name="com.zze.bean.Class" table="class" lazy="true">
  67. */
  68. @Test
  69. public void test32() {
  70. Session session = HibernateUtil.getCurrentSession();
  71. Transaction transaction = session.beginTransaction();
  72. Student student = session.get(Student.class, 1);
  73. Class clazz = student.getClazz(); // 发出 SQL
  74. System.out.println(clazz);
  75. transaction.commit();
  76. }

例 21:关联级别的延迟加载

抓取策略

概述

通过一个对象抓取关联对象需要发送 SQL ,SQL 如何发送及 SQL 的发送规则就可以通过抓取策略进行配置。

通过 <set> 或 <many-to-one> 上的 fetch 属性进行配置。

要考虑fetch 和这些标签上的 lazy 如何配置才能最大化优化发送的 SQL 语句。

set标签上的fetch和lazy

  • fetch

    抓取策略,控制 SQL 语句格式。

    在这里 fetch 有三个可选值:

    select : 默认值,发送普通 select 语句查询关联对象。

    join: 发送一条迫切左外连接查询关联对象。

    subselect : 发送子查询查询关联对象。

  • lazy

    延迟加载,控制查询关联对象时是否使用懒加载。

    在这里 lazy 有三个可选值:

    true : 默认值,查询关联对象时,使用延迟加载。

    false : 查询关联对象时,不使用延迟加载。

    extra : 及其懒惰。

  • 示例

    1. /**
    2. * com/zze/bean/Class.hbm.xml
    3. * 默认值:
    4. * <set name="students" cascade="save-update" fetch="select" lazy="true">
    5. */
    6. @Test
    7. public void test33() {
    8. Session session = HibernateUtil.getCurrentSession();
    9. Transaction transaction = session.beginTransaction();
    10. Class clazz = session.get(Class.class, 1);
    11. for (Student student : clazz.getStudents()) {
    12. System.out.println(student);// 发送 SQL
    13. }
    14. transaction.commit();
    15. /*
    16. Hibernate:
    17. select
    18. class0_.id as id1_0_0_,
    19. class0_.name as name2_0_0_
    20. from
    21. class class0_
    22. where
    23. class0_.id=?
    24. Hibernate:
    25. select
    26. students0_.cid as cid5_1_0_,
    27. students0_.id as id1_1_0_,
    28. students0_.id as id1_1_1_,
    29. students0_.name as name2_1_1_,
    30. students0_.age as age3_1_1_,
    31. students0_.gender as gender4_1_1_,
    32. students0_.cid as cid5_1_1_
    33. from
    34. student students0_
    35. where
    36. students0_.cid=?
    37. Student{id=2, name='张三'}
    38. Student{id=1, name='李四'}
    39. */
    40. }
    41.  
    42. /**
    43. * com/zze/bean/Class.hbm.xml
    44. *
    45. * <set name="students" cascade="save-update" fetch="select" lazy="false">
    46. */
    47. @Test
    48. public void test34() {
    49. Session session = HibernateUtil.getCurrentSession();
    50. Transaction transaction = session.beginTransaction();
    51. Class clazz = session.get(Class.class, 1); //发送 2 条 SQL
    52. for (Student student : clazz.getStudents()) {
    53. System.out.println(student);
    54. }
    55. transaction.commit();
    56. /*
    57. Hibernate:
    58. select
    59. class0_.id as id1_0_0_,
    60. class0_.name as name2_0_0_
    61. from
    62. class class0_
    63. where
    64. class0_.id=?
    65. Hibernate:
    66. select
    67. students0_.cid as cid5_1_0_,
    68. students0_.id as id1_1_0_,
    69. students0_.id as id1_1_1_,
    70. students0_.name as name2_1_1_,
    71. students0_.age as age3_1_1_,
    72. students0_.gender as gender4_1_1_,
    73. students0_.cid as cid5_1_1_
    74. from
    75. student students0_
    76. where
    77. students0_.cid=?
    78. Student{id=2, name='张三'}
    79. Student{id=1, name='李四'}
    80. */
    81. }
    82.  
    83. /**
    84. * com/zze/bean/Class.hbm.xml
    85. *
    86. * <set name="students" cascade="save-update" fetch="select" lazy="extra">
    87. */
    88. @Test
    89. public void test35() {
    90. Session session = HibernateUtil.getCurrentSession();
    91. Transaction transaction = session.beginTransaction();
    92. Class clazz = session.get(Class.class, 1);
    93. System.out.println(clazz.getStudents().size()); // 针对数量发送一条sql
    94. transaction.commit();
    95. /*
    96. Hibernate:
    97. select
    98. class0_.id as id1_0_0_,
    99. class0_.name as name2_0_0_
    100. from
    101. class class0_
    102. where
    103. class0_.id=?
    104. Hibernate:
    105. select
    106. count(id)
    107. from
    108. student
    109. where
    110. cid =?
    111. */
    112. }
    113.  
    114. /**
    115. * com/zze/bean/Class.hbm.xml
    116. * fetch="join" 时,lazy 失效
    117. * <set name="students" cascade="save-update" fetch="join" lazy="true">
    118. */
    119. public void test36() {
    120. Session session = HibernateUtil.getCurrentSession();
    121. Transaction transaction = session.beginTransaction();
    122. Class clazz = session.get(Class.class, 1);// 发送 SQL
    123. for (Student student : clazz.getStudents()) {
    124. System.out.println(student);
    125. }
    126. transaction.commit();
    127. /*
    128. Hibernate:
    129. select
    130. class0_.id as id1_0_0_,
    131. class0_.name as name2_0_0_,
    132. students1_.cid as cid5_1_1_,
    133. students1_.id as id1_1_1_,
    134. students1_.id as id1_1_2_,
    135. students1_.name as name2_1_2_,
    136. students1_.age as age3_1_2_,
    137. students1_.gender as gender4_1_2_,
    138. students1_.cid as cid5_1_2_
    139. from
    140. class class0_
    141. left outer join
    142. student students1_
    143. on class0_.id=students1_.cid
    144. where
    145. class0_.id=?
    146. Student{id=2, name='张三'}
    147. Student{id=1, name='李四'}
    148. */
    149. }
    150.  
    151. /**
    152. * com/zze/bean/Class.hbm.xml
    153. *
    154. * <set name="students" cascade="save-update" fetch="subselect" lazy="true">
    155. */
    156. @Test
    157. public void test37() {
    158. Session session = HibernateUtil.getCurrentSession();
    159. Transaction transaction = session.beginTransaction();
    160. Query query = session.createQuery("from Class");
    161. List<Class> list = query.list();
    162. for (Class clazz : list) {
    163. Set<Student> students = clazz.getStudents(); // 发送 SQL
    164. System.out.println(students);
    165. }
    166. transaction.commit();
    167. /*
    168. Hibernate:
    169. select
    170. class0_.id as id1_0_,
    171. class0_.name as name2_0_
    172. from
    173. class class0_
    174. Hibernate:
    175. select
    176. students0_.cid as cid5_1_1_,
    177. students0_.id as id1_1_1_,
    178. students0_.id as id1_1_0_,
    179. students0_.name as name2_1_0_,
    180. students0_.age as age3_1_0_,
    181. students0_.gender as gender4_1_0_,
    182. students0_.cid as cid5_1_0_
    183. from
    184. student students0_
    185. where
    186. students0_.cid in (
    187. select
    188. class0_.id
    189. from
    190. class class0_
    191. )
    192. [Student{id=1, name='李四'}, Student{id=2, name='张三'}]
    193. [Student{id=4, name='赵六'}, Student{id=3, name='王五'}]
    194. [Student{id=5, name='吴刚'}, Student{id=6, name='王如花'}]
    195. [Student{id=7, name='李志静'}, Student{id=8, name='何王天'}]
    196. */
    197. }
    198.  
    199. /**
    200. * com/zze/bean/Class.hbm.xml
    201. *
    202. * <set name="students" cascade="save-update" fetch="subselect" lazy="false">
    203. */
    204. @Test
    205. public void test38() {
    206. Session session = HibernateUtil.getCurrentSession();
    207. Transaction transaction = session.beginTransaction();
    208. Query query = session.createQuery("from Class");
    209. List<Class> list = query.list(); // 发送 SQL
    210. for (Class clazz : list) {
    211. Set<Student> students = clazz.getStudents();
    212. System.out.println(students);
    213. }
    214. transaction.commit();
    215. /*
    216. Hibernate:
    217. select
    218. class0_.id as id1_0_,
    219. class0_.name as name2_0_
    220. from
    221. class class0_
    222. Hibernate:
    223. select
    224. students0_.cid as cid5_1_1_,
    225. students0_.id as id1_1_1_,
    226. students0_.id as id1_1_0_,
    227. students0_.name as name2_1_0_,
    228. students0_.age as age3_1_0_,
    229. students0_.gender as gender4_1_0_,
    230. students0_.cid as cid5_1_0_
    231. from
    232. student students0_
    233. where
    234. students0_.cid in (
    235. select
    236. class0_.id
    237. from
    238. class class0_
    239. )
    240. [Student{id=1, name='李四'}, Student{id=2, name='张三'}]
    241. [Student{id=4, name='赵六'}, Student{id=3, name='王五'}]
    242. [Student{id=5, name='吴刚'}, Student{id=6, name='王如花'}]
    243. [Student{id=7, name='李志静'}, Student{id=8, name='何王天'}]
    244. */
    245. }

    例 22:

many-to-one上的fetch和lazy

  • fetch

    抓取策略,控制 SQL 语句格式。

    在这里 fetch 有两个可选值:

    select : 默认值,发送普通的 select 语句查询关联对象。

    join : 发送一条迫切左外连接查询关联对象。

  • lazy

    延迟加载,控制查询关联对象时是否使用懒加载。

    在这里 lazy 有三个可选值:

    proxy : 默认值,引用关联对象类的类级别加载策略。

    flase : 查询关联对象时,不使用延迟加载。

    no-proxy:不使用。

  • 示例

    1. /**
    2. * com/zze/bean/Student.hbm.xml
    3. * 默认值
    4. * <many-to-one name="clazz" column="cid" class="com.zze.bean.Class" fetch="select" lazy="proxy"/>
    5. *
    6. * com/zze/bean/Class.hbm.xml
    7. * <class name="com.zze.bean.Class" table="class" lazy="true">
    8. */
    9. @Test
    10. public void test39(){
    11. Session session = HibernateUtil.getCurrentSession();
    12. Transaction transaction = session.beginTransaction();
    13. Student student = session.get(Student.class, 1);
    14. System.out.println(student.getClazz()); // 发送 SQL
    15. transaction.commit();
    16. /*
    17. Hibernate:
    18. select
    19. student0_.id as id1_1_0_,
    20. student0_.name as name2_1_0_,
    21. student0_.age as age3_1_0_,
    22. student0_.gender as gender4_1_0_,
    23. student0_.cid as cid5_1_0_
    24. from
    25. student student0_
    26. where
    27. student0_.id=?
    28. Hibernate:
    29. select
    30. class0_.id as id1_0_0_,
    31. class0_.name as name2_0_0_
    32. from
    33. class class0_
    34. where
    35. class0_.id=?
    36. Class{id=1, name='软件一班'}
    37. */
    38. }
    39.  
    40. /**
    41. * com/zze/bean/Student.hbm.xml
    42. * 默认值
    43. * <many-to-one name="clazz" column="cid" class="com.zze.bean.Class" fetch="select" lazy="proxy"/>
    44. *
    45. * com/zze/bean/Class.hbm.xml
    46. * <class name="com.zze.bean.Class" table="class" lazy="false">
    47. */
    48. @Test
    49. public void test40(){
    50. Session session = HibernateUtil.getCurrentSession();
    51. Transaction transaction = session.beginTransaction();
    52. Student student = session.get(Student.class, 1);// 一次发送 2 条 SQL
    53. System.out.println(student.getClazz());
    54. transaction.commit();
    55. /*
    56. Hibernate:
    57. select
    58. student0_.id as id1_1_0_,
    59. student0_.name as name2_1_0_,
    60. student0_.age as age3_1_0_,
    61. student0_.gender as gender4_1_0_,
    62. student0_.cid as cid5_1_0_
    63. from
    64. student student0_
    65. where
    66. student0_.id=?
    67. Hibernate:
    68. select
    69. class0_.id as id1_0_0_,
    70. class0_.name as name2_0_0_
    71. from
    72. class class0_
    73. where
    74. class0_.id=?
    75. Class{id=1, name='软件一班'}
    76. */
    77. }
    78.  
    79. /**
    80. * com/zze/bean/Student.hbm.xml
    81. * fetch="join" 时,lazy 失效
    82. * <many-to-one name="clazz" column="cid" class="com.zze.bean.Class" fetch="join" lazy="proxy"/>
    83. */
    84. @Test
    85. public void test41(){
    86. Session session = HibernateUtil.getCurrentSession();
    87. Transaction transaction = session.beginTransaction();
    88. Student student = session.get(Student.class, 1);// 一条关联 SQL
    89. System.out.println(student.getClazz());
    90. transaction.commit();
    91. /*
    92. Hibernate:
    93. select
    94. student0_.id as id1_1_0_,
    95. student0_.name as name2_1_0_,
    96. student0_.age as age3_1_0_,
    97. student0_.gender as gender4_1_0_,
    98. student0_.cid as cid5_1_0_,
    99. class1_.id as id1_0_1_,
    100. class1_.name as name2_0_1_
    101. from
    102. student student0_
    103. left outer join
    104. class class1_
    105. on student0_.cid=class1_.id
    106. where
    107. student0_.id=?
    108. Class{id=1, name='软件一班'}
    109. */
    110. }

    例 23:

批量抓取

一批指定数量的关联数据一起查询。

  1. /**
  2. * 查询所有班级 及 所有班级下的学生信息
  3. * 默认情况下,查询所有班级会发一条 SQL,然后每次查询班级上的学生也会发送一条 SQL
  4. * 即如下有 4 个班级,会发 5 条SQL
  5. */
  6. @Test
  7. public void test42() {
  8. Session session = HibernateUtil.getCurrentSession();
  9. Transaction transaction = session.beginTransaction();
  10. Query query = session.createQuery("from Class");
  11. List<Class> list = query.list();
  12. for (Class clazz : list) {
  13. System.out.println(clazz);
  14. for (Student student : clazz.getStudents()) {
  15. System.out.println(student);
  16. }
  17. }
  18. transaction.commit();
  19. /*
  20. Hibernate:
  21. select
  22. class0_.id as id1_0_,
  23. class0_.name as name2_0_
  24. from
  25. class class0_
  26. Class{id=1, name='软件一班'}
  27. Hibernate:
  28. select
  29. students0_.cid as cid5_1_0_,
  30. students0_.id as id1_1_0_,
  31. students0_.id as id1_1_1_,
  32. students0_.name as name2_1_1_,
  33. students0_.age as age3_1_1_,
  34. students0_.gender as gender4_1_1_,
  35. students0_.cid as cid5_1_1_
  36. from
  37. student students0_
  38. where
  39. students0_.cid=?
  40. Student{id=1, name='李四'}
  41. Student{id=2, name='张三'}
  42. Class{id=2, name='软件二班'}
  43. Hibernate:
  44. select
  45. students0_.cid as cid5_1_0_,
  46. students0_.id as id1_1_0_,
  47. students0_.id as id1_1_1_,
  48. students0_.name as name2_1_1_,
  49. students0_.age as age3_1_1_,
  50. students0_.gender as gender4_1_1_,
  51. students0_.cid as cid5_1_1_
  52. from
  53. student students0_
  54. where
  55. students0_.cid=?
  56. Student{id=4, name='王五'}
  57. Student{id=3, name='赵六'}
  58. Class{id=3, name='汽修一班'}
  59. Hibernate:
  60. select
  61. students0_.cid as cid5_1_0_,
  62. students0_.id as id1_1_0_,
  63. students0_.id as id1_1_1_,
  64. students0_.name as name2_1_1_,
  65. students0_.age as age3_1_1_,
  66. students0_.gender as gender4_1_1_,
  67. students0_.cid as cid5_1_1_
  68. from
  69. student students0_
  70. where
  71. students0_.cid=?
  72. Student{id=5, name='王如花'}
  73. Student{id=6, name='吴刚'}
  74. Class{id=4, name='汽修二班'}
  75. Hibernate:
  76. select
  77. students0_.cid as cid5_1_0_,
  78. students0_.id as id1_1_0_,
  79. students0_.id as id1_1_1_,
  80. students0_.name as name2_1_1_,
  81. students0_.age as age3_1_1_,
  82. students0_.gender as gender4_1_1_,
  83. students0_.cid as cid5_1_1_
  84. from
  85. student students0_
  86. where
  87. students0_.cid=?
  88. Student{id=8, name='李志静'}
  89. Student{id=7, name='何王天'}
  90. */
  91. }
  92.  
  93. /**
  94. * com/zze/bean/Class.hbm.xml
  95. *
  96. * <set name="students" cascade="save-update" batch-size="4">
  97. * <p>
  98. * 一次抓取 4 条,就只需要发送 2 次 SQL
  99. * 一次查询所有班级,一次查询所有班级下的学生
  100. */
  101. @Test
  102. public void test43() {
  103. Session session = HibernateUtil.getCurrentSession();
  104. Transaction transaction = session.beginTransaction();
  105. Query query = session.createQuery("from Class");
  106. List<Class> list = query.list();
  107. for (Class clazz : list) {
  108. System.out.println(clazz);
  109. for (Student student : clazz.getStudents()) {
  110. System.out.println(student);
  111. }
  112. }
  113. transaction.commit();
  114. /*
  115. Hibernate:
  116. select
  117. class0_.id as id1_0_,
  118. class0_.name as name2_0_
  119. from
  120. class class0_
  121. Class{id=1, name='软件一班'}
  122. Hibernate:
  123. select
  124. students0_.cid as cid5_1_1_,
  125. students0_.id as id1_1_1_,
  126. students0_.id as id1_1_0_,
  127. students0_.name as name2_1_0_,
  128. students0_.age as age3_1_0_,
  129. students0_.gender as gender4_1_0_,
  130. students0_.cid as cid5_1_0_
  131. from
  132. student students0_
  133. where
  134. students0_.cid in (
  135. ?, ?, ?, ?
  136. )
  137. Student{id=1, name='李四'}
  138. Student{id=2, name='张三'}
  139. Class{id=2, name='软件二班'}
  140. Student{id=4, name='王五'}
  141. Student{id=3, name='赵六'}
  142. Class{id=3, name='汽修一班'}
  143. Student{id=5, name='王如花'}
  144. Student{id=6, name='吴刚'}
  145. Class{id=4, name='汽修二班'}
  146. Student{id=7, name='何王天'}
  147. Student{id=8, name='李志静'}
  148. */
  149. }
  150.  
  151. /**
  152. * 查询所有学生 及 所有学生所属班级信息
  153. * 默认情况下,查询所有学生会发送 1 条 SQL,然后每次查询每个学生的所属班级时也会发送一条 SQL,
  154. * 有 8 个学生,但一共有 4 个班级,由于一级缓存的作用,查询班级需要发送 4 条 SQL
  155. * 共发 5 条 SQL
  156. */
  157. @Test
  158. public void test44() {
  159. Session session = HibernateUtil.getCurrentSession();
  160. Transaction transaction = session.beginTransaction();
  161. Query query = session.createQuery("from Student");
  162. List<Student> list = query.list();
  163. for (Student student : list) {
  164. System.out.println(student.getClazz());
  165. }
  166. transaction.commit();
  167. /*
  168. Hibernate:
  169. select
  170. student0_.id as id1_1_,
  171. student0_.name as name2_1_,
  172. student0_.age as age3_1_,
  173. student0_.gender as gender4_1_,
  174. student0_.cid as cid5_1_
  175. from
  176. student student0_
  177. Hibernate:
  178. select
  179. class0_.id as id1_0_0_,
  180. class0_.name as name2_0_0_
  181. from
  182. class class0_
  183. where
  184. class0_.id=?
  185. Class{id=1, name='软件一班'}
  186. Class{id=1, name='软件一班'}
  187. Hibernate:
  188. select
  189. class0_.id as id1_0_0_,
  190. class0_.name as name2_0_0_
  191. from
  192. class class0_
  193. where
  194. class0_.id=?
  195. Class{id=2, name='软件二班'}
  196. Class{id=2, name='软件二班'}
  197. Hibernate:
  198. select
  199. class0_.id as id1_0_0_,
  200. class0_.name as name2_0_0_
  201. from
  202. class class0_
  203. where
  204. class0_.id=?
  205. Class{id=3, name='汽修一班'}
  206. Class{id=3, name='汽修一班'}
  207. Hibernate:
  208. select
  209. class0_.id as id1_0_0_,
  210. class0_.name as name2_0_0_
  211. from
  212. class class0_
  213. where
  214. class0_.id=?
  215. Class{id=4, name='汽修二班'}
  216. Class{id=4, name='汽修二班'}
  217. */
  218. }
  219.  
  220. /**
  221. * com/zze/bean/Class.hbm.xml
  222. * <class name="com.zze.bean.Class" table="class" batch-size="3">
  223. * <p>
  224. * many-to-one 关系时需在关联属性类映射文件下配置 batch-size
  225. * <p>
  226. * 查询所有学生 1 条 SQL,查询所有班级每次抓取 3 条,一共 4 个班级,会发 2 次 SQL
  227. */
  228. @Test
  229. public void test45() {
  230. Session session = HibernateUtil.getCurrentSession();
  231. Transaction transaction = session.beginTransaction();
  232. Query query = session.createQuery("from Student");
  233. List<Student> list = query.list();
  234. for (Student student : list) {
  235. System.out.println(student.getClazz());
  236. }
  237. transaction.commit();
  238. /*
  239. Hibernate:
  240. select
  241. student0_.id as id1_1_,
  242. student0_.name as name2_1_,
  243. student0_.age as age3_1_,
  244. student0_.gender as gender4_1_,
  245. student0_.cid as cid5_1_
  246. from
  247. student student0_
  248. Hibernate:
  249. select
  250. class0_.id as id1_0_0_,
  251. class0_.name as name2_0_0_
  252. from
  253. class class0_
  254. where
  255. class0_.id in (
  256. ?, ?, ?
  257. )
  258. Class{id=1, name='软件一班'}
  259. Class{id=1, name='软件一班'}
  260. Class{id=2, name='软件二班'}
  261. Class{id=2, name='软件二班'}
  262. Class{id=3, name='汽修一班'}
  263. Class{id=3, name='汽修一班'}
  264. Hibernate:
  265. select
  266. class0_.id as id1_0_0_,
  267. class0_.name as name2_0_0_
  268. from
  269. class class0_
  270. where
  271. class0_.id=?
  272. Class{id=4, name='汽修二班'}
  273. Class{id=4, name='汽修二班'}
  274. */
  275. }

例 24:

java框架之Hibernate(4)-几种检索方式的更多相关文章

  1. java框架篇---spring aop两种配置方式

    第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Befor ...

  2. Hibernate基础学习(七)—检索方式

    一.概述      Hibernate有五种检索方式. 1.导航对象图检索方式      根据已经加载的对象,导航到其他对象. Order order = (Order)session.get(Ord ...

  3. Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】

    []如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...

  4. Java连接Oracle数据库的三种连接方式

    背景: 这两天在学习Oracle数据库,这里就总结下自己上课所学的知识,同时记录下来,方便整理当天所学下的知识,也同时方便日后自己查询. SQL语句的话,这里我就不多讲了,感觉和其他的数据库(MySQ ...

  5. hibernate的三种查询方式

    hibernate的三种查询方式 目录 hibernate的三种查询方式 1.HQL查询 1.1.SQL概述 1.2.实体查询 1.3.带where的查询 1.3.属性查询 1.4.实体的更新和删除 ...

  6. java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询

    持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...

  7. java框架篇---hibernate入门

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDB ...

  8. java框架篇---hibernate之缓存机制

    一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...

  9. JAVA框架之Hibernate【Hibernate缓存详解】

    1.缓存介绍 Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存由hibernate管理的,一般情况下无需进行干预:第二级别的缓 ...

随机推荐

  1. 设置GRUB密码以防止单用户模式下root密码被恶意更改

    在使用LInux系统的时候可能会发生忘记root密码的情况,通常管理员会进入单用户模式下进行重置root密码.那么问题来了,既然管理员可以进入单用户模式,如果恶意用户可以接触的到计算机的话毫无疑问也是 ...

  2. vue及ElementUI环境搭建

    1. nodejs安装及npm安装 下载地址:https://nodejs.org/en/download/ 选择windows Installer 下载完成后 运行node-v8.11.1-x64. ...

  3. mongodb常用查询语法

    一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...

  4. 在windows 上自动重启 tomcat 的方法

    在windows 上自动重启 tomcat 的方法 实现思路: Windows 上监控tomcat 进程并且自动重启的脚本 一类是 定时重启 tomcat 一类是 监控并重启 写一个守护tomcat进 ...

  5. MySQL优化之——备份和恢复

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46766919 备份 逻辑备份方法 使用MYSQLDUMP命令备份 MYSQLDUM ...

  6. win7 win10开启网络访问(网络访问 无法访问 网络访问需要输入密码 等问题处理)

    狂客原创,转载请注明.侵权必究! 右键单击桌面的“网络”图标 选择“属性”. 在弹出的“网络和共享中心”窗口,点击“更改高级共享设置”. 参考文章:https://jingyan.baidu.com/ ...

  7. mock---前端搭建模拟服务

    在做前端开发接口的时候,往往接口都是从后端来的,这让前端很苦恼,但是有了 MockServer ,前端也可以搭建API服务了. server-mock是什么? 是一款nodejs的应用,用于搭建web ...

  8. 初识springcloud

    springcloud的基础是springboot,简单地说,就是通过写的springboot应用,使用springcloud集成. 在学习springcloud的过程中,自己的开发环境不能保证和博客 ...

  9. 11.8Django中的组件content_type

    2018-11-8 18:59:11 在Django中已经有一个contenttype这个组件,并且在python manage.py makemigrations 和migrate的时候,一起在数据 ...

  10. J - Printer Queue 优先队列与队列

    来源poj3125 The only printer in the computer science students' union is experiencing an extremely heav ...