`

hibernate--HQL查询语句(二)-----分组、排序

    博客分类:
  • JAVA
阅读更多
1.实体的更新和删除:
  在继续讲解HQL其他更为强大的查询功能前,我们先来讲解以下利用HQL进行实体更新和删除的技术。这项技术功能是Hibernate3的新加入的功能,在Hibernate2中是不具备的。
     比如在Hibernate2中,如果我们想将数据库中所有18岁的用户的年龄全部改为20岁,那么我们要首先将年龄在18岁的用户检索出来,然后将他们的年龄修改为20岁,最后调用Session.update()语句进行更新。
 
   在Hibernate3中对这个问题提供了更加灵活和更具效率的解决办法,如下面的代码:
  Transaction trans=session.beginTransaction();
  String hql=”update User user set user.age=20 where user.age=18”;
  Query queryupdate=session.createQuery(hql);
  int ret=queryupdate.executeUpdate();
  trans.commit();
  通过这种方式我们可以在Hibernate3中,一次性完成批量数据的更新,对性能的提高是相当的可观。同样也可以通过类似的方式来完成delete操作,如下面的代码:
  Transaction trans=session.beginTransaction();
  String hql=”delete from User user where user.age=18”;
  Query queryupdate=session.createQuery(hql);
  int ret=queryupdate.executeUpdate();
  trans.commit();
 2. 分组与排序
  A、Order by子句:
  与SQL语句相似,HQL查询也可以通过order by子句对查询结果集进行排序,并且可以通过asc或者desc关键字指定排序方式,如下面的代码:
  from User user order by user.name asc,user.age desc;
  上面HQL查询语句,会以name属性进行升序排序,以age属性进行降序排序,而且与SQL语句一样,默认的排序方式为asc,即升序排序。
  B、Group by子句与统计查询:
  在HQL语句中同样支持使用group by子句分组查询,还支持group by子句结合聚集函数的分组统计查询,大部分标准的SQL聚集函数都可以在HQL语句中使用,比如:count(),sum(),max(),min(),avg()等。如下面的程序代码:
  String hql=”select count(user),user.age from User user group by user.age having count(user)>10 ”;
  List list=session.createQuery(hql).list();
  C、优化统计查询:
  假设我们现在有两张数据库表,分别是customer表和order表,它们的结构如下:
  customer
  ID varchar2(14)
  age number(10)
  name varchar2(20)
  order
  ID varchar2(14)
  order_number number(10)
  customer_ID varchar2(14)
  现在有两条HQL查询语句,分别如下:
  from Customer c inner join c.orders o group by c.age;(1)
  select c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID
  from Customer c inner join c.orders c group by c.age;(2)
  这两条语句使用了HQL语句的内连接查询(我们将在HQL语句的连接查询部分专门讨论),现在我们可以看出这两条查询语句最后所返回的结果是一样的,但是它们其实是有明显区别的语句
   (1)检索的结果会返回Customer与Order持久化对象,而且它们会被置于Hibernate的Session缓存之中,并且Session会负责它们在缓存中的唯一性以及与后台数据库数据的同步,只有事务提交后它们才会从缓存中被清除;而语句
   (2)返回的是关系数据而并非是持久化对象,因此它们不会占用Hibernate的Session缓存,只要在检索之后应用程序不在访问它们,它们所占用的内存就有可能被JVM的垃圾回收器回收,而且Hibernate不会同步对它们的修改。
  在我们的系统开发中,尤其是Mis系统,不可避免的要进行统计查询的开发,这类功能有两个特点:第一数据量大;第二一般情况下都是只读操作而不会涉及到对统计数据进行修改,那么如果采用第一种查询方式,必然会导致大量持久化对象位于Hibernate的Session缓存中,而且Hibernate的Session缓存还要负责它们与数据库数据的同步。而如果采用第二种查询方式,显然就会提高查询性能,因为不需要Hibernate的Session缓存的管理开销,而且只要应用程序不在使用这些数据,它们所占用的内存空间就会被回收释放。
  因此在开发统计查询系统时,尽量使用通过select语句写出需要查询的属性的方式来返回关系数据,而避免使用第一种查询方式返回持久化对象(这种方式是在有修改需求时使用比较适合),这样可以提高运行效率并且减少内存消耗。㊣真正的高手并不是精通一切,而是精通在合适的场合使用合适的手段。
 
分享到:
评论

相关推荐

    Hibernate-HQL-查询-Query资料

    - "HQL语句(结合实例).doc"则可能提供了具体的查询示例,帮助读者更好地理解和应用HQL。 通过学习这些文档,开发者可以掌握如何在Hibernate项目中高效地利用HQL进行数据查询,提升开发效率,同时保持代码的简洁...

    Hibernate-HQL.rar_HQL_hibernate hql

    例如,查询所有User对象的HQL语句为:“FROM User”。 二、HQL基本结构 1. SELECT子句:HQL支持多种选择项,包括属性、方法、计算表达式等,如“SELECT u.name FROM User u”。 2. FROM子句:指定查询的实体类,如...

    hibernate-distribution-3.6.0

    HQL使得开发者可以脱离具体的数据库方言,写出可移植性强的查询语句。 4. ** Criteria API**:为那些不喜欢HQL或者需要更动态查询的开发者提供了另一种选择。Criteria API允许在运行时构建查询,提供了一种更加面向...

    hibernate 中HQL语句查询学习笔记

    ### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...

    hibernate-release-5.3.5.Final

    3. 查询:使用HQL或Criteria API进行复杂查询,支持分页、排序、条件筛选等功能。 4. 事务管理:在Hibernate中,事务可以通过Transaction接口进行管理,确保数据的一致性。 五、优化与最佳实践 1. 利用二级缓存提升...

    hibernate 查询?Hibernate的HQL查询

    二、Hibernate查询语言(HQL) 1. HQL基础:HQL基于面向对象的概念,将表映射为类,列映射为属性,使得查询更符合Java开发者的思维模式。它支持连接(inner/outer/full joins)、投影、聚合、分组、排序、子查询以及...

    Spring--HQL-chaxun.zip_HQL

    可以在Hibernate配置文件中定义命名查询,将HQL语句与名字关联,提高代码复用性和可读性。 7. **联合查询**: 使用`JOIN`关键字可以实现对象之间的关联查询,包括内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT...

    Hibernate数据检索(HQL)笔记

    - **灵活性**:支持复杂的查询表达式,如分组、排序等。 ##### 2. HQL 查询示例 - **查找特定条件下的对象**: - **示例1**:查找姓名为“张三”的用户的所有信息。 ```java Criteria cri = session....

    Hibernate-Criteria 模糊查询

    Hibernate作为一款优秀的Java持久层框架,提供了多种方式来进行数据库操作,其中包括HQL(Hibernate Query Language)、Criteria API以及Native SQL等。其中,Criteria API由于其简洁的API设计和强大的查询能力,受...

    hibernate-release-5.4.25.Final_Hibernate5.4.25_hibernate所需jar包_源

    1. hibernate-core-5.4.25.Final.jar:包含Hibernate ORM的核心功能,如实体管理、查询语言(HQL)、事务处理等。 2. hibernate-entitymanager-5.4.25.Final.jar:提供了对JPA规范的支持,使得开发者可以使用标准的...

    hql基础语句

    - ** 排序与分组 **:`order by`和`group by`语句用于排序结果和按属性分组。 - ** 扩展查询 **:如`left outer join`、`right outer join`等,实现不同类型的连接。 ### 示例 假设我们有一个`Student`实体和`...

    hibernate-3.6.8-doc-zh

    4. 查询操作:使用HQL或Criteria API进行数据查询,可以进行复杂的条件过滤、分页和排序。 六、最佳实践 1. 使用二级缓存提高性能:配置合适的缓存策略,减少数据库访问。 2. 合理设计实体关系:避免深度嵌套的对象...

    Hibernate-基础联表模板

    "Hibernate-基础联表模板"是针对Hibernate中联表查询的一个实用工具,旨在帮助开发者快速地进行多表关联查询,而不必记住复杂的SQL语句。 1. **Hibernate简介** Hibernate是一种开源的ORM框架,它允许开发者将Java...

    hibernate3.2 (十)HQL查询

    Hibernate会自动将HQL语句转化为相应的SQL,这个过程称为查询优化。开发者可以通过开启Hibernate的日志来查看实际执行的SQL语句,以便进行性能分析和优化。 五、HQL的参数绑定 HQL支持参数绑定,避免SQL注入,提高...

    Hibernate查询语言(HQL)

    - **支持高级特性**:HQL 支持复杂的查询操作,如联接、分组、排序等,并且可以很好地处理一对多和多对多的关系。 - **语法简洁**:HQL 的语法相对简洁,易于理解和编写。 #### 三、HQL 基础查询 - **基本的 ...

    hibernate hql各类查询范例

    第二个示例展示了如何使用 HQL 进行参数化查询。方法名为 `getDutyManOfGroup`,其中 HQL 语句如下: ```java "from syidt.modules.grp.basegrp.persistence.Person as person where person.theGroup.groupOID=?"; `...

    hibernate-3.2.rar

    它可以方便地进行复杂查询,如关联查询、分组、排序等。Criteria API则是另一种动态构建查询的方式,更加面向对象,适合在运行时动态构造查询条件。 六、缓存机制 为了提高性能,Hibernate 3.2引入了缓存机制。一...

    Hibernate查询语言(HQL) 语法参考

    Hibernate 查询语言(HQL)语法...HQL 还支持其他子句,例如 where、order by、group by 等,可以用于对查询结果进行过滤、排序和分组等操作。 HQL 是一种强大的查询语言,它可以帮助我们快速、高效地检索和操作数据。

    hibernate-note学习笔记

    - **复杂查询**: 如分组、排序、子查询等。 #### 附录:MySQL、Oracle和SQL Server综合对照表 - **配置文件对照表**:列出不同数据库的配置文件差异。 - **常用ID生成策略**:比较不同数据库下的ID生成策略及其适用...

    hibernate的hql语句

    【hibernate的HQL语句】是Hibernate框架中用于操作数据库的重要组成部分,它是一种面向对象的查询语言,类似于SQL,但更加强调对象的概念。HQL能够处理复杂的对象关系,如继承、多态和关联,使得在进行SSH(Spring、...

Global site tag (gtag.js) - Google Analytics