`
langgufu
  • 浏览: 2309155 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

教你使用Hibernate的QBC查询(转载)

阅读更多

转载自:http://developer.51cto.com/art/200906/131743.htm

QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。我们看下面的示例程序:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.add(Expression.eq(“name”,”zx”));   
  3. criteria.add(Expression.eq(“age”,new Integer(27));   
  4. List list=criteria.list();  

当执行criteria.list()时会生成类似这样的SQL语句:

  1. Select * from user where name=’zx’   
  2. and   
  3. age=27; 

所以在这里我们可以看出,Criteria实际上是一个查询容器,它对查询条件表达式的添加进行了封装,具体的查询条件是通过add()方法添加的,而且具体的查询条件的表达式运算是通过Expression指定的。Hibernate在运行期会根据Criteria指定的表达式条件来添加查询条件,并且生成查询语句。这种方式非常符合Java以及所有面向对象编程语言的编程方式,所以大多数的持久层框架都提供了对这种方式查询的支持。下面我们讲解这种查询方式的各个技术细节。

1、Criteria查询表达式:

正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制。

方法描述 
Expression.eq对应SQL的“field=value”表达式 
如:Expression.eq(“name”,”zx”); 
Expression.allEq方法的参数为一个Map类型对象,包含多个名/值对对应关系,相当于多个Expression.eq的叠加 
Expression.gt对应SQL的“field>value”表达式 
Expression.ge对应SQL的“field>=value”表达式 
Expression.lt对应SQL的“field”表达式 
Expression.le对应SQL的“field< =value”表达式 
Expression.between对应SQL语句的between表达式,如:查询年龄在21与27岁之间的用户,可以写成Expression.between(“age”,new 
Integer(21),new Integer(27)); 
Expression.like对应SQL语句的”field like value”表达式 
Expression.in对应SQL语句的“field in(……)”表达式 
Expression.eqProperty用于比较两个属性值,对应”field=field”SQL表达式 
Expression.gtProperty用于比较两个属性值,对应”field>field”SQL表达式 
Expression.geProperty用于比较两个属性值,对应”field>=field”SQL表达式 
Expression.ltProperty用于比较两个属性值,对应”field表达式 
Expression.leProperty用于比较两个属性值,对应”field< =field”SQL表达式 
Expression.and对应SQL语句的And关系组合,如:Expression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”)); 
Expression.or对应SQL语句的Or关系组合,如:Expression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
Expression.sql作为补充这个方法提供了原生SQL语句查询的支持,在执行时直接通过原生SQL语句进行限定,如:Expression.sql(“lower({alias}.name) 
like (?)”,“zhao%”,Hibernate.STRING) ;在运行时{ alias 
}将会由当前查询所关联的实体类名替换,()中的?将会由”zhao%”替换,并且类型由Hibernate.STRING指定。

注意:Expression各方法中的属性参数(各方法中的第一个参数)所指定的属性名称(如:name,sex),并不是数据库表中的实际字段名称,而是实体对象中映射实际数据表字段的类属性名称。 

2、示例查询:

示例查询是通过Example类来完成的,Example类实现了Criterion接口,可以用作Criteria查询条件,Example类的作用是:根据已有对象,查询属性值与之相同的其他对象。如下代码所示:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. User exampleuser=new User(“zx”);   
  3. criteria.add(Example.create(exampleuser));   
  4. List list=criteria.list();   
  5. for(int i=0;i   
  6. User user=(User)list.get(i);   
  7. System.out.println(user.getName()+”\n”);   
  8. }  

上述代码中User exampleuser=new User(“zx”);criteria.add(Example.create(exampleuser));两句相当于criteria.add(Expression.eq(“name”,”zx”));因此会生成类似如下的SQL语句:

  1. select * from user where name=’zx’; 

在上面的代码中exampleuser称为示例对象。 

在Hibernate中队示例查询,默认情况下会排除掉示例对象中属性值为空的属性,还可以调用Example.excludeNone(排除空串值)/excludeZeros(排除零值),或者调用Example.excludeProperty方法来指定排除特定属性。

示例查询主要应用于组合查询中,比如根据用户输入的查询条件动态生成最终的查询语句,通过使用示例查询,可以避免由于查询条件过多而写的大量if判断语句。

3、复合查询:

复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如User实体对象与Addres实体对象具有一对多的关联关系,我们可以如下构造符合查询:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. Criteria addcriteria=criteria.createCriteria(“addresses”);(1)   
  3. addcriteria.add(Express.like(“address”,”%tianjin%”));   
  4.   List list=criteria.list();   
  5. for(int i=0;i   
  6.   User user=(User)list.get(i);   
  7.   System.out.println(user.getName()+”\n”);   
  8.   Set addresses=user.getAddresses();   
  9.   Iterator it=addresses.iterator();   
  10.   while(it.hasNext(){   
  11. Address address=(Address)it.next();   
  12. System.out.println(address.getAddress()+”\n”);   
  13.   }   
  14. }  

当执行到了(1)处时,表明要针对User对象的addresses属性添加新的查询条件,因此当执行criteria.list()时,Hibernate会生成类似如下的SQL语句:

  1. Select * from user inner join address on user.id=address.id where   
  2. address.address like ‘%shanghai%’;  

正如我们所见,我们可以通过向Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象),来构造复合查询,在数据库一端是通过内连接查询来实现。

4、Criteria的高级特性:

A、限定返回记录条数:

我们可以通过利用Criteria.setFirstResult/setMaxResult方法来限定返回某一次查询的记录数,如下代码:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.setFirstResult(100);   
  3. criteria.setMaxResult(200);  

通过以上代码可以设定该次查询返回user表中的从第100条记录开始直到第200条记录结束的100条记录。

B、对查询结果进行排序:

可通过使用net.sf.hibernate.expression.Order类可以对查询结果集进行排序,如下面代码:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.add(Expression.eq(“groupid”,”2”);   
  3. criteria.addOrder(Order.asc(“name”));   
  4. criteria.addOrder(Order.desc(“groupid”));   
  5. List list=criteria.list();  

通过使用Order类的asc()/desc()方法,可以指定针对某个字段的排序逻辑,如果执行上述代码,会生成类似如下的SQL语句:

  1. Select * from user where groupid=’2’ order by name asc,groupid desc  

C、分组与统计:

在Hibernate3中,对Criteria又增添了新功能,可以支持分组与统计功能,在Hibernate3中增加了Projections以及ProjectionList类,这两个类对分组与统计功能进行了封装,如下代码:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.setProjection(Projections.groupProperty(“age”));(1)   
  3. List list=criteria.list();   
  4. Iterator it=list.iterator();   
  5. while(it.hasNext()){   
  6.  System.out.println(it.next());   
  7. }  

通过(1)处的代码,我们通过Projections类指定了用于分组的目标属性,当进行检索时Hibernate会生成类似如下的SQL语句:

  1. Select age from user group by age;  

还可以通过使用Projections的avg()/rowCount()/count()/max()/min()/countDistinct()等方法来实现统计功能,如下面的代码示例:

  1. Criteria criteria=session.createCriteria(User.class);   
  2. criteria.setProjection(Projections.avg(“age”));(1)   
  3. List list=criteria.list();   
  4. Iterator it=list.iterator();   
  5. while(it.hasNext()){   
  6.  System.out.println(it.next());   
  7. }  

通过(1)处的代码,我们实现了对用户平均年龄的统计,当进行检索时,Hibernate会生成类似如下的SQL语句:

  1. Select avg(age) from user;  

另外,在SQL语句中的多条件分组与统计功能,可以利用ProjectionList类来实现,如下面代码所示:

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

通过以上代码,实现了对不同年龄人员数量的分组统计,当进行检索时,Hibernate会生成类似如下的SQL语句:

  1. Select age,count(*) from user group by age;  

5、DetachedCriteria:

在Hibernate2中,Criteria实例是与创建它的Session实例具有相同的生命周期的,也就是说,Session实例是它所创建的Criteria实例的宿主,当Session关闭时,寄生于Session实例的Criteria都将失效。这就对Criteria的重用造成了困难,为了实现Criteria实例的重用,在Hibernate3中提供了一个DetachedCriteria类,DetachedCriteria实例的生命周期与Session实例的生命周期无关,我们可以利用DetachedCriteria对一些常用的Criteria查询条件进行抽离,当需要进行检索时再与Session实例关联,从而获得运行期的Criteria实例。如下面的代码所示:

  1. DetachedCriteria dc= DetachedCriteria.forClass(User.class);   
  2. dc.add(Expression.eq(“name”,”zhaoxin”));   
  3. dc.add(Expression.eq(“sex”,”1”));   
  4. Criteria criteria=dc.getExecutableCriteria(session);   
  5. Iterator it=criteria.list().iterator();   
  6. while(it.hasNext()){   
  7.   User user=(User)it.next();   
  8.   System.out.println(user.getName());   
  9. }  

正如我们所见,DetachedCriteria的生存周期与session实例无关,当需要进行检索时,通过getExecutableCriteria(session)方法,与当前的Session实例关联并获得运行期的Criteria实例,完成检索。

DetachedCriteria也可以用于完成子查询功能,如下代码所示:

  1. DetachedCriteria dc= DetachedCriteria.forClass(User.class);   
  2. dc.setProjection(Projections.avg(“age”));   
  3. Criteria criteria=session.createCriteria(User.class);   
  4. criteria.add(Subqueries.propertyGt(“age”,dc));   
  5. List list=criteria.list(); 

通过Subqueries类,实现了添加子查询的功能,我们将DetachedCriteria所设定的查询条件,当作子查询添加到了运行时Criteria实例的查询条件中,当执行检索时Hibernate会生成类似如下的SQL语句:

  1. Select * from user where age>(select avg(age) from user group by age); 

【编辑推荐】

  1. Hibernate的三个状态(1)
  2. Hibernate 中Clob字段的使用
  3. Hibernate自动生成标
  4. Hibernate的三个状态(3)
  5. Hibernate的三个状态(2)
【责任编辑:梦见 TEL:(010)68476606】
分享到:
评论

相关推荐

    Hibernate(HQL、QBC查询)源码

    Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码

    Hibernate QBC高级查询.rar

    **正文** Hibernate是一个Java开发中的持久化框架...提供的资源“Hibernate QBC高级查询.wps”应该包含详细的讲解和示例代码,帮助你掌握这些高级技巧。请仔细研读,通过实践来巩固理论知识,提升你的Hibernate技能。

    Java_Hibernate QBC条件查询对比

    本篇文章将深入探讨Hibernate中的QBC(Query By Example)条件查询与传统的HQL(Hibernate Query Language)查询的对比,帮助开发者更好地理解和选择适合的查询方式。 QBC(Query By Example)是Hibernate提供的一...

    QBC的各种查询

    在实际开发中,QBC与Hibernate的其他查询方式,如HQL(Hibernate Query Language)和Criteria API,可以灵活搭配使用,根据项目需求选择最适合的查询手段。QBC的优势在于它的直观性和灵活性,但可能在性能上略逊于...

    Hibernate_QBC和Hibernate_QBE

    在使用Hibernate时,开发者可能会借助IDE(如Eclipse、IntelliJ IDEA)中的插件或辅助工具来方便地构建QBC和QBE查询。例如,IDE的代码提示功能可以帮助快速完成Criteria对象的构建,而某些插件甚至提供了图形化的...

    QBC_hibernate完整用法

    收录了QBC_hibernate完整用法.大家可以下载看看.作为参考.

    Hibernate QBC分页

    本篇将详细介绍如何使用Hibernate的Query By Criteria (QBC)方式进行分页查询。 首先,我们需要了解QBC的基本概念。QBC是Hibernate提供的一种基于对象的查询方式,与HQL(Hibernate Query Language)类似,但更接近...

    Hibernate_QBC查询[归类].pdf

    Hibernate QBC(Query By Criteria)查询是Hibernate框架中一种面向对象的查询方式,它通过提供Criteria API使得开发者能够更方便地构建和执行SQL查询。QBC查询的优势在于它允许程序员用更加面向对象的方式处理...

    Hibernate实例开发 HQL 与 QBC 查询

    本教程将深入探讨Hibernate中的两种查询方式:HQL(Hibernate Query Language)和QBC(Query By Example)。通过实例开发,我们将了解这两种查询方法的使用和它们之间的差异。 首先,HQL是Hibernate专门设计的一种...

    Hibernate的查询方式

    本文将深入探讨Hibernate的查询方式,特别聚焦于HQL(Hibernate Query Language)查询方式以及QBC(Query By Criteria)查询方式,旨在帮助读者全面理解并掌握这些核心功能。 #### HQL查询方式:面向对象的查询语言...

    QBC查询的别名方的

    根据提供的文件信息,我们可以推断出此文档主要讨论了QBC(Query By Criteria)查询方法在Hibernate框架中的应用。下面将对文档中的几个关键点进行详细的解析与扩展。 ### QBC查询简介 QBC(Query By Criteria)是...

    Hibernate教程21_HIbernate查询

    本教程将深入探讨Hibernate中的查询机制,包括HQL(Hibernate Query Language)和QBC(Query by Criteria)。通过实例代码和详细解释,我们将了解如何高效地在数据库中检索数据。 ### Hibernate查询语言(HQL) ...

    QBC的使用全集大全

    **QBC(Query By Example)**是Hibernate框架中的一种查询方式,它允许开发者通过实例对象来构造查询条件,提供了一种更加面向对象的查询方法。QBC查询在处理复杂的动态查询时尤其方便,因为它可以避免编写大量的SQL...

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    总的来说,Hibernate的`Criteria`、`Query`以及QBC(Query By Criteria)提供了灵活且强大的查询手段,它们不仅支持基本的单表查询,还能处理复杂的联表、分页、参数绑定和统计需求,是Java开发者进行数据库操作的...

    Hibernate_QBC案例.rar

    // 1.查询所有 ...聚集函数使用(聚合函数)(count、sum、avg、max、min等) // 9.TOP N查询 ———————————————— 原文链接:https://blog.csdn.net/qq_29001539/article/details/105182223

    hibernate实现动态SQL查询

    为了实现动态SQL,我们可以借助于Hibernate的QBC(Query By Criteria)和Criteria API,或者使用第三方库如MyBatis的动态SQL功能。本文主要讨论使用XML配置和FREEMARKER的方法。 四、XML配置SQL 在Hibernate中,...

    Hibernate-HQL-QBC-QBE

    3. QBC(Query By Criteria):QBC是另一种在Hibernate中进行数据查询的方法,它基于Java的标准API(JPA的Criteria API或Hibernate的Criteria API)。QBC允许开发者构建动态查询,通过定义一组标准和约束来获取满足...

    hibernate+spring+springmvc框架 @注解开发 详细配置注释/及hibernate的HQL/QBC/SQL查询代码使用及注释

    之前也发了一个,这个包含之前的,还添加了hibernate对数据库操作的代码(注意:controller层两个QBC/SQLTest代码不能运行,只是写出了操作数据库的除了HQL的另外2种方式)。我发现现在还是有很多公司用hibernate+...

    hibernate查询代码

    **正文** Hibernate是一款强大的Java持久化框架,它简化了数据库操作,使得开发人员可以更加专注于业务逻辑而不是数据库交互。...希望这篇文章能帮助你更好地理解和使用Hibernate进行数据库查询。

Global site tag (gtag.js) - Google Analytics