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

Hibernate QBC高级查询

阅读更多
转载自:http://blog.csdn.net/lenotang/archive/2008/10/05/3018375.aspx
Hibernate QBC查询

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

Criteria criteria=session.createCriteria(User.class); 

criteria.add(Expression.eq(“name”,”zx”)); 

criteria.add(Expression.eq(“age”,new Integer(27)); 

List list=criteria.list(); 




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



Cri1、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<value”表达式

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<field”SQL表达式

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、2、示例查询:

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

Criteria criteria=session.createCriteria(User.class); 

User exampleuser=new User(“zx”); 

criteria.add(Example.create(exampleuser)); 

List list=criteria.list(); 

for(int i=0;i<list.size();i++){ 

   User user=(User)list.get(i); 

   System.out.println(user.getName()+”\n”); 

} 


上述代码中User exampleuser=new User(“zx”);criteria.add(Example.create(exampleuser));两句相当于

criteria.add(Expression.eq(“name”,”zx”));因此会生成类似如下的SQL语句:

select * from user where name=’zx’;在上面的代码中exampleuser称为示例对象。



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

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

3、复合查询:

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

Criteria criteria=session.createCriteria(User.class); 

   Criteria addcriteria=criteria.createCriteria(“addresses”);(1) 

   addcriteria.add(Express.like(“address”,”%tianjin%”)); 

  List list=criteria.list(); 

   for(int i=0;i<list.size();i++){ 

     User user=(User)list.get(i); 

     System.out.println(user.getName()+”\n”); 

     Set addresses=user.getAddresses(); 

     Iterator it=addresses.iterator(); 

     while(it.hasNext(){ 

      Address address=(Address)it.next(); 

      System.out.println(address.getAddress()+”\n”); 

     } 

   } 



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

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

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



433、Criteria的高级特性:

A、限定返回记录条数:

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

Criteria criteria=session.createCriteria(User.class); 

criteria.setFirstResult(100); 

criteria.setMaxResult(200); 




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

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

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

Criteria criteria=session.createCriteria(User.class); 

criteria.add(Expression.eq(“groupid”,”2”); 

criteria.addOrder(Order.asc(“name”)); 

criteria.addOrder(Order.desc(“groupid”)); 

List list=criteria.list(); 




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

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



C、分组与统计:

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

Criteria criteria=session.createCriteria(User.class); 

criteria.setProjection(Projections.groupProperty(“age”));(1) 

List list=criteria.list(); 

Iterator it=list.iterator(); 

while(it.hasNext()){ 

System.out.println(it.next()); 

} 


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

Select age from user group by age;

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

Criteria criteria=session.createCriteria(User.class); 

criteria.setProjection(Projections.avg(“age”));(1) 

List list=criteria.list(); 

Iterator it=list.iterator(); 

while(it.hasNext()){ 

System.out.println(it.next()); 

} 


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

Select avg(age) from user;

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

Criteria criteria=session.createCriteria(User.class); 

ProjectionList prolist=Projections.projectionList(); 

prolist.add(Projections.groupProperty(“age”)); 

prolist.add(Projections.rowCount()); 

criteria.setProjection(prolist); 

List list=criteria.list(); 


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

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实例。如下面的代码所示:

  
DetachedCriteria dc= DetachedCriteria.forClass(User.class); 

   dc.add(Expression.eq(“name”,”zhaoxin”)); 

   dc.add(Expression.eq(“sex”,”1”)); 

   Criteria criteria=dc.getExecutableCriteria(session); 

   Iterator it=criteria.list().iterator(); 

   while(it.hasNext()){ 

     User user=(User)it.next(); 

     System.out.println(user.getName()); 

   } 



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

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

DetachedCriteria dc= DetachedCriteria.forClass(User.class); 

dc.setProjection(Projections.avg(“age”)); 

Criteria criteria=session.createCriteria(User.class); 

criteria.add(Subqueries.propertyGt(“age”,dc)); 

List list=criteria.list(); 




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

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

/*****************************以下为原创*******************************/

子查询中 in 的用法

//主查询sql: 
Criteria criteria=this.getSession().createCriteria(CYgdwCaiji.class);    
		
//创建子查询
DetachedCriteria dc= DetachedCriteria.forClass(CShbxCaiji.class); 
  
//设置子查询中要查出来的字段		
dc.setProjection(Property.forName("cid"));  

//子查询中的条件
dc.add(Property.forName("jbsbcbqk").isNotNull());

//主sql中加入 in('')中的数据。
criteria.add(Property.forName("cid").in(dc));

//主sql中加入其它条件
if(obja!=null)
{
criteria.add(Expression.in("street", obja));  
}
		
List<CYgdwCaiji>list=criteria.list();  



生成的sql如下:
select *
  from C_YGDW_CAIJI this_
 where this_.CID in (select this0__.CID as y0_
                       from C_SHBX_CAIJI this0__
                      where this0__.JBSBCBQK is not null)
   and this_.STREET in (?)


分享到:
评论

相关推荐

    Hibernate QBC高级查询.rar

    本资源“Hibernate QBC高级查询”聚焦于Hibernate Query by Criteria(QBC)的高级用法,旨在帮助开发者深入理解并熟练运用这一强大的查询机制。 Query by Criteria是Hibernate提供的另一种查询方式,与HQL...

    QBC QBE查询

    QBC是Hibernate提供的一个高级查询接口,它允许开发者通过实例化Criteria对象来构造查询条件,从而实现动态查询。QBC的优点在于它可以更好地映射到对象模型,避免了直接编写SQL语句,提高了代码的可读性和可维护性。...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置...hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式

    hibernate查询方法

    QueryOver是NHibernate(.NET版Hibernate)引入的一个高级查询API,但也可以在Java Hibernate中使用,它提供了更丰富的查询语法。虽然在Java中使用QueryOver不如使用Criteria API常见,但在某些场景下,QueryOver能...

    QBC的使用全集大全

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

    qbc表达式

    QBC是Hibernate框架提供的一个高级查询接口,允许开发者通过编程的方式构造复杂的查询条件,而不需要直接编写SQL语句。这种方式极大地提高了代码的可读性和可维护性,同时也使得查询逻辑更加灵活多变。 #### 二、...

    hibernate查询

    在 Hibernate 中进行查询是其核心功能之一,本文将详细介绍 Hibernate 的几种查询方式,包括 HQL (Hibernate Query Language) 查询、QBC (Query By Criteria) 查询以及 QBE (Query By Example) 查询,并结合示例代码...

    Hibernate 简单 PPT 总结

    深入QBC查询.md可能涵盖了Hibernate的Query By Criteria API,这是另一种查询数据库的方式,除了传统的HQL(Hibernate Query Language)外,开发者可以通过构建Criteria对象来执行动态查询,这种方式更接近面向对象...

    常见hibernate面试题.doc

    - **QBC (Query By Criteria)**:QBC是基于标准的API接口进行查询的方式,它提供了一个灵活的查询构建器,允许开发者构建复杂的查询条件。QBC支持多种条件组合,并且易于扩展。 - **本地SQL**:直接使用数据库的SQL...

    hibernate中文帮助文档

    6. **HQL与QBC**: Hibernate查询语言(HQL)是面向对象的查询语言,类似SQL但更接近Java。另外,Query By Criteria(QBC)提供了一种基于对象的查询方式,可以动态构建查询条件。 7. **级联操作与缓存**: Hibernate...

    Hibernate开发指南.rar

    此外,Query By Criteria(QBC)也是Hibernate提供的查询接口,与Criteria API类似,但更加面向对象。 七、缓存机制 为了提高性能,Hibernate引入了缓存机制。一级缓存是Session级别的,自动管理对象的持久状态;二...

    Hibernate的检索方式

    HQL(Hibernate Query Language)是一种面向对象的查询语言,它类似于SQL但更加面向对象。通过HQL,可以编写类似SQL的查询语句来检索对象。 **特点**: - **面向对象**:查询结果自动转换为对象。 - **易于理解**:...

    Hibernate 进阶教程

    7. **HQL和QBC**:Hibernate查询语言(HQL)是面向对象的查询语言,与SQL类似但更贴近Java编程。Query By Criteria API提供了一种基于对象的方式来构建查询,两者的使用和优化技巧。 8. **缓存机制**:探讨...

    深入浅出Hibernate

    5. HQL和QBC:Hibernate查询语言(HQL)和Query By Criteria(QBC)是Hibernate提供的两种高级查询方式,它们允许开发者以面向对象的方式编写查询,避免了直接使用SQL的复杂性。 6. 关联映射:详细阐述一对一、一对...

    hibernate 3.2中文手册 中文文档

    ### Hibernate 3.2中文手册知识点汇总 #### 第1章:Hibernate入门 - **1.1 前言** - 介绍了Hibernate的基本...这些知识点涵盖了从Hibernate的基本使用到高级配置和技术细节,有助于深入理解和掌握Hibernate框架。

    Hibernate.pdf

    7. Hibernate高级特性:包含组件映射、继承映射、连接池支持以及QBC(Query By Criteria)查询等。组件映射和继承映射是指将复杂对象结构映射到数据库表中,连接池支持是指Hibernate可以配置连接池来管理数据库连接...

    hibernate试验

    本实验“Hibernate试验”主要关注的是通过Hibernate使用SQL查询,包括本地SQL检索、命名SQL查询以及自定义SQL语句,同时也涉及到QBC(Query By Criteria)查询方式,这是一种基于对象的查询方式,与HQL(Hibernate ...

    hibernate语句大全

    以上介绍了Hibernate中几种常见的查询方式,包括HQL、QBC、原生SQL以及一些高级查询技巧如分组、排序等。掌握这些基本操作可以帮助开发者更高效地使用Hibernate框架进行数据访问操作。随着实践经验的积累,还可以...

    韩顺平2011hibernate3.3视频教程资料

    5. **HQL和QBC查询**:介绍Hibernate查询语言(HQL)和Criteria API,它们是比SQL更面向对象的查询方式,用于检索和操作数据。 6. **一对多、多对一关系映射**:讲解如何配置和管理对象之间的关联,如一个用户可以...

    Hibernate 课件及源代码

    内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射(1-n、1-1、n-n、继承映射)、检索策略、检索方式(对象导航图、OID 检索、HQL、QBC、本地SQL)、Hibernate 一\二级缓存、...

Global site tag (gtag.js) - Google Analytics