- 浏览: 62166 次
- 来自: 北京
最新评论
-
caowei3047:
确实强悍。
不过jquery的那个仿igoogle组件似乎也不 ...
仿igoogle拖动框 -
zhangyuqing052:
没用的,还会过期!
何让Struts From提交后“后退”页面不过期 -
skorpi:
跟我现在一样,一点动力都没有,都想回家种地了,对技术也不是那么 ...
迷茫,2年工作经验的小兵的迷茫 -
jason.hsu:
..这样作不行..甚至还少一个.mymetadata文件..
怎么将java工程修改为myeclipse识别的web工程 -
dean_liu:
Seam Requirements 写道
Seam 2.x e ...
与我一起学seam(1)
Hibernate QBC查询
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以及所有面向对象编程语言的编程方式,所以大多数的持久层框架都提供了对这种方式查询的支持。下面我们讲解这种查询方式的各个技术细节。
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类的作用是:根据已有对象,查询属性值与之相同的其他对象。如下代码所示:
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
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
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对象),来构造复合查询,在数据库一端是通过内连接查询来实现。
4、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);
发表评论
-
帝国cms 灵动标签高级提升
2011-09-20 16:13 2487灵动标签调友情连接分类调用方法。 用以下标签就可以实现了![ ... -
帝国cms 灵动标签 循环嵌套
2011-09-20 16:07 5155<div id="menu" ... -
svn数据回滚.
2011-08-09 18:53 3581这里讲一下svn中文件删除了(前提,不是从服务器端删除的,只 ... -
svn 不同版本数据合并
2011-08-09 18:27 3977搞java开发的人员基本都用过svn,但是常用的基本功能也就 ... -
Eclipse编码格式修改(转)
2011-07-04 18:17 1269eclipse plugin 由gbk转为utf8后出现各 ... -
spring BeanWrapperImpl方便的嵌套属性(list)操作
2010-01-21 09:59 4526转载自: http://blog.csdn.net/zyl62 ... -
简易版web页面分析采集器
2009-11-13 10:27 1308import java.io.BufferedReader; ... -
仿igoogle拖动框
2009-11-10 14:37 1176如题 -
eclipse设置 默认工程文件都是utf8
2009-11-10 12:43 770如题。 -
在web和j2se中两个不同环境下 读取配置文件 备忘
2009-11-10 12:32 696如题。 见附件 -
acegi开发 实例
2009-10-20 09:31 782转自:http://zhanjia.iteye.com/blo ... -
ibatise例子
2009-02-12 17:02 685dd -
怎么将java工程修改为myeclipse识别的web工程
2009-01-09 15:11 5029摘抄自:百度知道。 修改工程目录下的.projec ... -
主题:关于网络信息安全的对谈录
2008-12-26 15:10 721摘自: http://www.iteye.com/ ... -
java 调用dll
2008-12-26 12:44 828java 调用dll 备忘。
相关推荐
标题"Hibernate_QBC和Hibernate_QBE"提及了两个关于Hibernate的查询方式,即Query By Criteria(QBC)和Query By Example(QBE)。Hibernate是Java领域中一个广泛使用的对象关系映射(ORM)框架,它允许开发者以面向...
Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码
本资源“Hibernate QBC高级查询”聚焦于Hibernate Query by Criteria(QBC)的高级用法,旨在帮助开发者深入理解并熟练运用这一强大的查询机制。 Query by Criteria是Hibernate提供的另一种查询方式,与HQL...
总结来说,Hibernate QBC查询是一种强大的查询机制,它通过Criteria API和Expression类提供了丰富的查询表达式,使得开发人员可以在不直接接触SQL的情况下进行复杂的数据库操作。这种面向对象的查询方式不仅简化了...
QBC,全称为Query By Criteria,是Java世界中一种基于对象的查询方式,主要用于简化Hibernate框架中的数据查询操作。QBC提供了一种面向对象的方式来构建查询条件,与SQL语句相比,它更易于理解和维护,尤其在处理...
本篇文章将深入探讨Hibernate中的QBC(Query By Example)条件查询与传统的HQL(Hibernate Query Language)查询的对比,帮助开发者更好地理解和选择适合的查询方式。 QBC(Query By Example)是Hibernate提供的一...
查询所有 // 2.条件查询 // 3.模糊查询 // 4.范围查询 // 5.排序查询(order by) // 6.分页查询 // 7.投影查询(只获取部分字段的结果) // 8.聚集函数使用(聚合函数)(count、sum、avg、max、min等) // 9.TOP N...
收录了QBC_hibernate完整用法.大家可以下载看看.作为参考.
QBC是Hibernate提供的一种基于对象的查询方式,与HQL(Hibernate Query Language)类似,但更接近Java的API,允许我们根据对象的属性来构建查询条件。在进行分页查询时,QBC提供了`setFirstResult()`和`...
本教程将深入探讨Hibernate中的两种查询方式:HQL(Hibernate Query Language)和QBC(Query By Example)。通过实例开发,我们将了解这两种查询方法的使用和它们之间的差异。 首先,HQL是Hibernate专门设计的一种...
3. QBC(Query By Criteria):QBC是另一种在Hibernate中进行数据查询的方法,它基于Java的标准API(JPA的Criteria API或Hibernate的Criteria API)。QBC允许开发者构建动态查询,通过定义一组标准和约束来获取满足...
除了HQL,Hibernate还支持QBC查询方式,这是一种基于Criteria API的查询方式,提供了更加类型安全和灵活的查询构建器。通过Criteria API,开发者可以动态地构建复杂的查询条件,而不必关心具体的SQL语法。 ##### ...
为了实现动态SQL,我们可以借助于Hibernate的QBC(Query By Criteria)和Criteria API,或者使用第三方库如MyBatis的动态SQL功能。本文主要讨论使用XML配置和FREEMARKER的方法。 四、XML配置SQL 在Hibernate中,...
下面我们将详细介绍如何在Spring Boot项目中集成Hibernate,并创建一个分页查询的示例。 首先,我们需要在项目中添加Spring Boot的起步依赖(Starter)和Hibernate的相关依赖。在`pom.xml`或`build.gradle`文件中,...
**Hibernate查询方法大全** Hibernate,作为Java领域中最流行的持久化框架之一,提供了多种查询数据的方法。这些方法使得开发者能够高效地从数据库中检索、更新和删除数据,无需编写大量SQL语句。本篇文章将深入...
3. QBC(Query By Criteria)标准查询: Criteria API提供了一种面向对象的方式来构建查询,适用于动态查询构建。它主要涉及Criteria、Criterion、Order和Restrictions等类。 A. 简单的Criteria查询: ```java ...
3. **QBC(Query By Example)**: 通过实例对象来构造查询,适用于简单场景。假设你有一个`User`对象,你想找到所有和这个对象属性相匹配的用户: ```java User exampleUser = new User(); exampleUser.setAge...
4. **Criteria查询**:Criteria API是一种完全面向对象的查询方式,也称为QBC(Query By Criteria)。它允许开发者动态构建查询,无需预先知道查询的具体形式。 5. **SQLQuery**:对于HQL无法满足的复杂SQL查询需求...
之前也发了一个,这个包含之前的,还添加了hibernate对数据库操作的代码(注意:controller层两个QBC/SQLTest代码不能运行,只是写出了操作数据库的除了HQL的另外2种方式)。我发现现在还是有很多公司用hibernate+...