`

HQL实体对象查询

阅读更多

2、实体对象查询【重要】
* N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题
所谓的N+1是在查询的时候发出了N+1条sql语句
1: 首先发出一条查询对象id列表的sql
N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
* list和iterate的区别?
* list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
* iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题
参见:SimpleObjectQueryTest1.java/SimpleObjectQueryTest2.java
  1. /**
  2. *出现N+1问题
  3. *
  4. *1:发出查询id列表的sql
  5. *Hibernate:selectstudent0_.idascol_0_0_fromt_studentstudent0_
  6. *
  7. *N:在依次发出根据id查询Student对象的sql
  8. *Hibernate:selectstudent0_.idasid1_0_,student0_.nameasname1_0_,
  9. *student0_.createTimeascreateTime1_0_,student0_.classesidasclassesid1_0_
  10. *fromt_studentstudent0_wherestudent0_.id=?
  11. *
  12. */
  13. Iteratoriter=session.createQuery("fromStudent").iterate();
  14. while(iter.hasNext()){
  15. Studentstudent=(Student)iter.next();
  16. System.out.println(student.getName());
  17. }
  18. ==================================================================
  19. Liststudents=session.createQuery("fromStudent").list();
  20. for(Iteratoriter=students.iterator();iter.hasNext();){
  21. Studentstudent=(Student)iter.next();
  22. System.out.println(student.getName());
  23. }
  24. System.out.println("---------------------------------------------");
  25. /**
  26. *不会出现N+1问题
  27. *
  28. *因为list操作已经将Student对象放到了一级缓存中,所以再次使用iterate操作的时候
  29. *它首先发出一条查询id列表的sql,在根据id到缓存中去数据,只有在缓存中找不到相应的
  30. *数据时,才会发出sql到数据库中查询
  31. *
  32. */
  33. Iteratoriter=session.createQuery("fromStudent").iterate();
  34. while(iter.hasNext()){
  35. Studentstudent=(Student)iter.next();
  36. System.out.println(student.getName());
  37. }
  38. ====================================================================
  39. Liststudents=session.createQuery("fromStudent").list();
  40. for(Iteratoriter=students.iterator();iter.hasNext();){
  41. Studentstudent=(Student)iter.next();
  42. System.out.println(student.getName());
  43. }
  44. System.out.println("---------------------------------------------");
  45. /**
  46. *再次发出查询sql
  47. *
  48. *在默认情况下list每次都会向数据库发出查询对象的sql,除非配置查询缓存,所以下面的list操作
  49. *虽然在一级缓存中已经有了对象数据,但list默认情况下不会利用缓存,而再次发出sql
  50. *
  51. *默认情况下,list会向缓存中放入数据,但不会利用数据
  52. *
  53. */
  54. students=session.createQuery("fromStudent").list();
  55. for(Iteratoriter=students.iterator();iter.hasNext();){
  56. Studentstudent=(Student)iter.next();
  57. System.out.println(student.getName());
  58. }

分享到:
评论

相关推荐

    HQL 语法总结 实体查询

    ### HQL语法总结:实体查询详解 #### 一、实体查询概述 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以一种类似于SQL但更接近于面向对象的方式来编写查询。本文将详细介绍HQL中的实体...

    hibernateHQL关联查询

    在实际开发中,HQL关联查询的应用场景非常广泛,特别是在需要跨多个实体进行数据检索的情况下。例如,在电子商务系统中,我们需要获取用户信息及其相关的订单信息时,就可以利用HQL关联查询来简化这一过程。此外,当...

    HQL查询pdf资料

    HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了与SQL类似的功能,但更贴近于面向对象编程的思维方式。HQL允许开发人员以一种更自然的方式查询数据库,同时保持了Java对象模型的一致性。 #### ...

    hibernate的HQL的模糊查询

    HQL是一种面向对象的查询语言,它的语法结构与SQL类似,但更关注于对象和实体,而不是数据库表和列。HQL允许开发者直接操作Java对象,避免了直接编写SQL语句的麻烦,并且支持跨数据库的移植性。 二、HQL模糊查询...

    HQL是hibernate自己的一套查询

    `Example`是另一种用于查询的方式,主要用于匹配实体对象的某些属性。 ```java Session session = HibernateUtil.getSession(); List<User> users = session.createCriteria(User.class) .add(Example.create(user...

    HQL.pdf数据查询语句

    HQL与SQL语法类似,但它理解Java实体和属性,因此HQL查询的对象是Java类而不是数据库中的表。 首先,HQL的基本查询语句包括从特定实体类中查询记录。例如,查询一个名为User的实体类的所有记录,可以使用以下语句:...

    hibernate hql各类查询范例

    - **DetachedCriteria** 是 Hibernate 提供的一个用于构建查询的 API,可以创建灵活且可重用的查询对象。 - **Restrictions.eq()** 用于添加等于约束。 - **Projections.projectionList()** 和 **Projections.max()*...

    Hibernate之HQL查询

    FROM子句指定要查询的对象,可以是一个实体类,也可以是多对一、一对多、多对多关联的类。例如: ```sql SELECT c FROM Course c JOIN c.students AS s WHERE s.name = '张三' ``` 此查询将返回所有张三选修的课程...

    Spring中常用的hql查询方法

    在Spring框架与Hibernate技术结合使用时,HQL(Hibernate Query Language)作为对象查询语言被广泛应用于数据查询操作之中。本文将详细解析Spring框架中常用的HQL查询方法及其应用场景。 #### 一、find(String ...

    全面解析HQL语句 非常详细直接的HQL语句的功能介绍

    HQL是一种面向对象的查询语言,用于在Hibernate框架中执行数据检索任务。它允许开发人员以一种接近Java语言的方式进行数据库操作,从而简化了数据访问层的复杂度。 ### 1. from子句 `from`子句是HQL语句的基础,...

    HibernateUtil分装完整版HQL查询

    HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是针对对象模型而非关系数据库设计的。HQL允许开发者以类和属性的名称进行查询,而不是表和列名,这使得代码更具可读性和可维护性。例如,你可以通过HQL...

    Hibernate实例开发 HQL 与 QBC 查询

    首先,HQL是Hibernate专门设计的一种面向对象的查询语言,它的语法类似于SQL,但更注重对象而非表。例如,如果我们有一个`User`实体,我们可以使用HQL来获取所有用户: ```java Session session = sessionFactory....

    hql精点查询语句.doc

    HQL是Hibernate框架提供的一种面向对象的查询语言,它允许开发人员以面向对象的方式编写数据库查询,而无需直接处理SQL语句,从而简化了数据访问逻辑。 ### 1. FROM子句 FROM子句用于指定查询的对象来源。例如,...

    HQL多对多的查询语句分析

    HQL(Hibernate Query Language)是Hibernate框架提供的面向对象的查询语言,它允许开发者用类名和属性名称来执行SQL查询,使得代码更加易读且与数据库无关。本文将深入分析HQL在处理多对多关系时的查询语句及其应用...

    Hibernate HQL查询语句总结.docx

    * HQL 语句可以用于查询继承关系中的实体对象,例如:from Employee,可以检索出所有 Employee 类型实体对象所对应的数据,包括它的子类 HourlyEmployee、SalariedEmployee 对应的数据。 例子: * from User user ...

    Hibernate教程(数据查询)HQL,PDF格式

    在数据查询方面,Hibernate提供了多种查询方式,其中HQL(Hibernate Query Language)是一种基于SQL的领域查询语言,它允许开发者以面向对象的方式编写查询语句,而无需直接处理复杂的SQL语句。本文将深入探讨...

    HQL查询语言基础.

    HQL(Hibernate Query Language)是Hibernate框架中用于操作对象关系映射(ORM)的查询语言,它与SQL类似,但专为面向对象编程设计。HQL允许开发者以类和对象的方式编写查询,而不是直接处理数据库表格。 ### 1. ...

Global site tag (gtag.js) - Google Analytics