- 浏览: 264089 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
cannysqurrel:
http://wizkm.com/wizkm/invite/4 ...
缺一个整理日常翻阅资料的工具 -
54sunboy:
这些资料我都是用evernote收集和归类的。电子书或文档暂时 ...
缺一个整理日常翻阅资料的工具 -
tuo_bing:
请问 ,如果 Tomcat的配置为 : <Cont ...
tomcat 发布多个项目时抛的webAppRootKey错误 -
syzxf1996:
thank you ,想收藏,没有成功,只能留言了。希望下回还 ...
display tag中去除不需要的参数 -
Alanのjava:
谢谢!楼主
javascript视频教程下载
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各方法中的属性参数(各方法中的第一个参数)所指定的属性名称(如: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);
|
发表评论
-
hibernate sequence主键生成策略
2009-09-28 16:49 1067sequence列在hibernate中的配置 *.h ... -
Hibernate的检索方式详解(一)
2009-09-18 17:14 1341版权声明:转载时请以 ... -
log4j 使用手册
2009-06-09 18:17 819log4j在强调可重用组件开发的今天,除了自己从头到尾开发一个 ... -
inverse和cascade的区别
2009-03-25 16:09 10691.inverse属性:inverse所描述的是对象之间关联关 ... -
Hibernate中的cascade和inverse
2009-03-25 15:53 818这两个属性都用于一多对或者多对多的关系中。 ... -
Hibernate cascade
2009-03-25 15:47 1257Hibernate cascade(转) 2008-12-1 ... -
Hibernate关系映射简介
2009-03-25 15:33 988Hibernate关系映射简介 Hibernate关 ... -
HBERNATE查询语句(HQL)基本语法
2009-03-03 14:24 1946HQL查询: Criteria查询对查询条件进行了面向 ... -
*.hbm.xml的配置详解
2009-02-26 14:10 1427在Hibernate中,各表的映 ... -
关于Clob类型在Hibernate中的应用小结
2008-10-28 16:54 1616关于Clob类型在Hibernate中的应用小结(2) (20 ... -
Hibernate+Oracle+CLOB的读写问题
2008-10-28 11:27 1654Hibernate+Oracle+CLOB的读写问题 from ... -
Hibernate实现Clob和Blob对象的存取
2008-10-22 15:31 2210转自:http://hpingliu.blog.ccidnet ... -
hibernate Expression详解
2008-09-08 17:26 1259hibernate Expression详解 Expressi ... -
条件查询(Criteria Query)
2008-07-04 09:36 1454条件查询(Criteria Query) 现在Hiberna ... -
HQL查询
2008-07-03 17:47 877Criteria查询对查询条件进行了面向对象封装,符合编程人员 ... -
在Struts和Hibernate之间搭起桥梁
2008-06-06 10:27 1099在Struts和Hibernate之间搭起桥梁 ...
相关推荐
Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码
Hibernate_QBC查询
QBC的各种查询,采用mvc多hibernate的封装,是很好的资料
Hibernate实例开发 HQL 与 QBC 查询
Hibernate_QBC查询[归类].pdf
QBC高级查询加快来了来了来了来了来了来了来了来的说法第三方的说法都是十分的舒服
Hibernate criteria queris 条件查询(QBC)转 Hibernate QBC查询 QBC分页查询大全
Hibernate QBC高级查询 大家放心收藏! saivixky出品!必属精品!
使用Hibernate的QBC查询,对数据库内容进行分页查询,在控制他显示,可跳转转的页面
HQL与QBC的查询条件(33k)
Hibernate中使用Criteria Query各种QBC查询
hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置...hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
User实体(id, name, age, sex, ctime),使用...2、DAO的实现类,分别采用hql查询,QBC查询,本地SQL查询实现 3、查询包括: 根据ID查询, 查询所有用户(包括:不分页、分页) 根据条件查询(包括:不分页、分页)
Java_Hibernate QBC条件查询对比
SSH笔记-HQL查询(基于位置参数查询、基于命名参数查询、分页查询、命名查询、投影查询报表查询、内/迫切内/左外/迫切左外连接查询)、QBC(QBC检索查询、统计查询、排序查询、HQL操作数据库)、本地SQL查询
查询所有 // 2.条件查询 // 3.模糊查询 // 4.范围查询 // 5.排序查询(order by) // 6.分页查询 // 7.投影查询(只获取部分字段的结果) // 8.聚集函数使用(聚合函数)(count、sum、avg、max、min等) // 9.TOP N...
QBC的相关讲义和例题 QBC(Query By Criteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句。
本套教程基于通用Mapper最新版4.0.0,在详细讲解常规增删改查操作、QBC查询之外,还包括逆向工程MBG工具、二级缓存@CacheNamespace注解、TypeHandler类型处理器、枚举类型映射方式等知识点。通过具体例子详细讲解了...
QBC.QBE查询 hibernate提供的更加面向对象的查询方式 希望对你有所帮助
本套教程基于通用Mapper新版4.0.0,在详细讲解常规增删改查操作、QBC查询之外,还包括逆向工程MBG工具、二级缓存@CacheNamespace注解、TypeHandler类型处理器、枚举类型映射方式等知识点。通过具体例子详细讲解了...