`

Hibernate之Criteria进阶查询[转]

阅读更多
Hibernate之Criteria进阶查询
2009-06-30 23:57

使用Criteria进行查询时,不仅仅能组合出SQL中where子句的功能,还可以组合出如排序、统计、分组等的查询功能。这就是Criteria进阶查询。

排序
您可以使用Criteria进行查询,并使用org.hibernate.criterion.Order对结果进行排序,例如使用Oder.asc(),指定根据”age”由小到大排序(反之则使用desc()):

  1. Criteria criteria = session.createCriteria(User.class);
  2. criteria.addOrder(Order.asc("age"));
  3. List users = criteria.list();

注意在加入Order条件时,使用的是addOrder()方法,而不是add()方法,在产生SQL语句时,会使用order by与asc(desc)来进行排序指定:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ order by this_.age asc

限定查询笔数
Criteria的setMaxResults()方法可以限定查询回来的笔数,如果配合setFirstResult()设定传回查询结果第一笔资料的位置,就可以实现简单的分页,例如传回第51笔之后的50笔资料(如果有的话):

  1. Criteria criteria = session.createCriteria(User.class);
  2. criteria.setFirstResult(51);
  3. criteria.setMaxResults(50);
  4. List users = criteria.list();

根据您所指定得资料库,Hibernate将自动产生与资料库相依的限定笔数查询子句,例如在MySQL中,将使用limit产生以下的SQL语句:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ limit ?, ?

统计动作
您可以对查询结果进行统计动作,使用 org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min ()、 countDistinct()等方法,再搭配Criteria的setProjection()方法加入条件设定,例如对查询结果的"age"作平均:

  1. Criteria criteria = session.createCriteria(User.class);
  2. criteria.setProjection(Projections.avg("age"));
  3. List users = criteria.list();

上面的程式将由Hibernate自动产生SQL的avg函数进行平均计算:

Hibernate: select avg(this_.age) as y0_ from T_USER this_

分组
还可以配合Projections的groupProperty()来对结果进行分组,例如以"age"进行分组,也就是如果资料中"age"如果有 20、20、25、30,则以下会显示20、25、30:

  1. Criteria criteria = session.createCriteria(User.class);
  2. criteria.setProjection(Projections.groupProperty("age"));
  3. List users = criteria.list();

上面的程式将由Hibernate自动产生SQL的group by子句进行分组计算:

Hibernate: select this_.age as y0_ from T_USER this_ group by this_.age

如果想同时结合统计与分组功能,则可以使用org.hibernate.criterion.ProjectionList,例如下面的程式会计算每个年龄各有多少个人:

  1. ProjectionList projectionList = Projections.projectionList();
  2. projectionList.add(Projections.groupProperty("age"));
  3. projectionList.add(Projections.rowCount());
  4. Criteria criteria = session.createCriteria(User.class);
  5. criteria.setProjection(projectionList);
  6. List users = criteria.list();

观察所产生的SQL语句,将使用group by先进行分组,再针对每个分组进行count函数的计数,

Hibernate: select this_.age as y0_, count(*) as y1_ from T_USER this_ group by this_.age

根据已知物件进行查询
设定查询条件并非一定要使用Restrictions,如果属性条件很多,使用Restrictions也不方便,如果有一个已知的物件,则可以根据这个物件作为查询的依据,看看是否有属性与之类似的物件,例如:

  1. User user = new User();
  2. user.setAge(new Integer(30));
  3. Criteria criteria = session.createCriteria(User.class);
  4. criteria.add(Example.create(user));
  5. List users = criteria.list();

Criteria进阶查询中,您可以透过 org.hibernate.criterion.Example的create()方法来建立Example实例,Example实作了 Criteria介面,因此可以使用add()方法加入至Criteria条件设定之中,Hibernate将自动过滤掉空属性,根据已知物件上已设定的属性,判定是否产生于where子句之中:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=?)

设定SQL范本
如果您了解如何撰写SQL语句,想要设定一些Hibernate产生SQL时的范本,您也可以使用Restrictions的sqlRestriction()方法,提供SQL语法范本作限定查询,例如查询name以cater开头的资料:

  1. Criteria criteria = session.createCriteria(User.class);
  2. criteria.add(Restrictions.sqlRestriction(
  3. "{alias}.name LIKE (?)", "cater%", Hibernate.STRING));
  4. List users = criteria.list();

其中alias将被替换为与User类别相关的名称,而? 将被替换为cater%,也就是第二个参数所提供的值,sqlRestriction()方法第一个参数所设定的是where子句的部份,所以在SQL撰写时,不必再写where,观察所产生的SQL语句,将使用您所设定的SQL范本作为基础,来完成SQL的条件查询:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.name LIKE (?)

如果有多个查询条件,例如between子句的查询,则可以如下:

  1. Criteria criteria = session.createCriteria(User.class);
  2. Integer[] ages = {new Integer(20), new Integer(40)};
  3. Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER};
  4. criteria.add(Restrictions.sqlRestriction(
  5. "{alias}.age BETWEEN (?) AND (?)", ages, types));
  6. List users = criteria.list();

观察所产生的SQL语句如下:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age BETWEEN (?) AND (?)

Criteria进阶查询就介绍到这里。

 

分享到:
评论

相关推荐

    Hibernate-Criteria 模糊查询

    ### Hibernate-Criteria 模糊查询详解 #### 一、引言 在软件开发过程中,数据库查询操作是非常常见的需求之一。Hibernate作为一款优秀的Java持久层框架,提供了多种方式来进行数据库操作,其中包括HQL(Hibernate ...

    Hibernate 进阶教程

    《Hibernate 进阶教程》是一本专为对Hibernate有初步了解并希望深入学习的开发者准备的手册。Hibernate作为Java领域中最流行的持久化框架之一,它极大地简化了数据库操作,使得开发者能够更专注于业务逻辑,而非繁琐...

    基于Spring与Hibernate的数据库操作进阶

    4. ** Criteria API**:除了HQL,Hibernate还提供了Criteria API,它允许动态构建查询,避免硬编码查询字符串,增强了代码的可读性和安全性。 5. **Spring的Hibernate集成**:通过配置XML或Java配置,可以实现...

    进阶查询herbinate

    在标题和描述中提到的“进阶查询herbinate”实际上是指使用Hibernate的Criteria API进行高级查询,包括分组、统计和排序等功能。 首先,我们可以使用`Criteria`来创建一个查询对象,然后通过`addOrder()`方法添加...

    hibernate框架基础教程适合新手

    了解如何优化Hibernate性能是进阶的关键,包括合理使用批处理、避免N+1查询、减少数据库访问次数等。 通过阅读`纯手写hibernate.txt`文档,观看`hibernate基础day01.wmv`视频,实践`hibernate-hand`中的示例,你...

    Hibernate实战

    查询语言在Hibernate中主要有两种:HQL(Hibernate Query Language)和 Criteria API。HQL是面向对象的查询语言,类似于SQL,但更接近于Java的语法。Criteria API则提供了一种动态构建查询的方式,更加灵活且类型...

    Hibernate中文文档+hibernate annotation +distribution

    4. 查询(Querying):Hibernate支持HQL(Hibernate Query Language)和Criteria API,它们是面向对象的查询方式,相比原生SQL更直观且易于维护。 在实际开发中,利用Hibernate Annotation可以轻松地实现以下功能:...

    Hibernate学习文档集合

    此外,还讲解了Criteria查询、HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)的语法和优势,这些强大的查询工具使开发者可以编写更加简洁和高效的代码。 综上所述,这三份文档全面覆盖...

    hibernate--1.什么是 Hibernate ?

    5. **Criteria API** 和 **Query API**:提供了更现代、类型安全的查询方式,是Hibernate 4.0之后推荐的查询方式。 6. **第二级缓存**:支持缓存策略,提高应用程序性能。 7. **事务处理**:提供了对数据库事务的...

    Hibernate 3.1.2中文文档

    Hibernate是一款开源的...阅读Hibernate 3.1.2中文文档,不仅可以了解这些基本概念,还能深入学习到如检索策略、批处理、缓存优化等进阶主题,这对于任何希望掌握Hibernate或者ORM技术的Java开发者来说都是宝贵的资源。

    hibernate in action 中文版书籍

    9. **高级特性**:涵盖动态模型、多态性、集合元素类型、子查询、联合实体、继承策略等进阶主题,提升开发者对Hibernate的深入理解和运用能力。 10. **最佳实践与实战经验**:分享作者在实际项目中积累的Hibernate...

    hibernate学习笔记_北大青鸟课堂笔记全文

    Querydsl是一个强大的查询工具,可以与Hibernate的Criteria API结合使用,提供更加强大的类型安全查询能力,避免运行时错误。 9. Hibernate缓存 Hibernate提供了缓存机制,包括一级缓存(Session级别的)和二级...

    hibernate第一个hibernate

    学习完基础后,可深入研究Hibernate的高级特性,如 Criteria API、Hibernate Search 和 JPA 规范等。 总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。...

    hiberanate进阶之路jar

    《Hibernate进阶之路:深入解析相关jar包》 在Java世界中,Hibernate作为一个优秀的对象关系映射(ORM)框架,极大地简化了数据库操作。本文将深入探讨与Hibernate进阶之路相关的jar包,帮助开发者理解这些核心组件...

    韩顺平hibernate3.3视频教程源码1-3day

    - HQL(Hibernate Query Language):学习Hibernate的SQL方言,用于更方便地进行对象查询,包括基本查询、条件查询、聚合函数、分组、排序等。 - Criteria API:了解一种更加面向对象的查询方式,可以动态构建查询...

    hibernate立体结构文档

    总结,“hibernate3.0立体文档”中的32个示例覆盖了Hibernate的基础和进阶应用,包括配置、映射、CRUD操作、查询、关联关系、事务和性能调优等方面,为初学者和开发者提供了丰富的学习资源。通过实践这些例子,能更...

    传智播客_hibernate

    通过以上讲解,我们可以看到,传智播客的Hibernate教程覆盖了从基础到进阶的各个方面,为初学者提供了全面的学习资源。掌握Hibernate能够极大地提升Java开发中的数据库操作效率,是Java开发者必备的技能之一。通过...

    Hibernate 3.5.2 中文API

    5. **Criteria查询**:除了传统的HQL(Hibernate Query Language)查询,Hibernate还提供了Criteria API进行动态查询,无需编写SQL,通过构建Criteria对象并添加各种限制条件,可以方便地执行复杂查询。 6. **Query...

    hibernate_reference中文版和Hibernate中文手册

    12. 高级特性:包括 Criteria API、HQL、子查询、联合查询、存储过程、CGLIB和JPA集成等,这些都是深入理解和使用Hibernate时需要掌握的内容。 以上只是Hibernate基本概念和关键知识点的概述,具体到《Hibernate...

Global site tag (gtag.js) - Google Analytics