Hibernate QBC查询
来源:互联网 发布:java垃圾回收机制理解 编辑:程序博客网 时间:2024/06/17 21:55
QBC查询:
Criteriacriteria=session.createCriteria(User.class);
criteria.add(Expression.eq(“name”,”zx”));
criteria.add(Expression.eq(“age”,newInteger(27));
Listlist=criteria.list();
当执行criteria.list()时会生成类似这样的SQL语句:Select* from user where name=’zx’ andage=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),newInteger(27));Expression.like对应SQL语句的”field likevalue”表达式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、示例查询:
Criteriacriteria=session.createCriteria(User.class);
User exampleuser=newUser(“zx”);
criteria.add(Example.create(exampleuser));
Listlist=criteria.list();
for(inti=0;i
}
上述代码中User exampleuser=newUser(“zx”);criteria.add(Example.create(exampleuser));两句相当于
criteria.add(Expression.eq(“name”,”zx”));因此会生成类似如下的SQL语句:
select * from user wherename=’zx’;在上面的代码中exampleuser称为示例对象。
3、复合查询:
复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如User实体对象与Addres实体对象具有一对多的关联关系,我们可以如下构造符合查询:
Criteriacriteria=session.createCriteria(User.class);
当执行到了(1)处时,表明要针对User对象的addresses属性添加新的查询条件,因此当执行criteria.list()时,Hibernate会生成类似如下的SQL语句:
Select * from user innerjoin address on user.id=address.id where address.address like‘%shanghai%’;
正如我们所见,我们可以通过向Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象),来构造复合查询,在数据库一端是通过内连接查询来实现。
4、Criteria的高级特性:
A、限定返回记录条数:
Criteriacriteria=session.createCriteria(User.class);
criteria.setFirstResult(100);
criteria.setMaxResult(200);
通过以上代码可以设定该次查询返回user表中的从第100条记录开始直到第200条记录结束的100条记录。
B、对查询结果进行排序:
Criteriacriteria=session.createCriteria(User.class);
criteria.add(Expression.eq(“groupid”,”2”);
criteria.addOrder(Order.asc(“name”));
criteria.addOrder(Order.desc(“groupid”));
Listlist=criteria.list();
通过使用Order类的asc()/desc()方法,可以指定针对某个字段的排序逻辑,如果执行上述代码,会生成类似如下的SQL语句:
Select * from user wheregroupid=’2’ order by name asc,groupid desc
C、分组与统计:
Criteriacriteria=session.createCriteria(User.class);
criteria.setProjection(Projections.groupProperty(“age”));(1)
Listlist=criteria.list();
Iteratorit=list.iterator();
while(it.hasNext()){
}
通过(1)处的代码,我们通过Projections类指定了用于分组的目标属性,当进行检索时Hibernate会生成类似如下的SQL语句:
Select age from user groupby age;
还可以通过使用Projections的avg()/rowCount()/count()/max()/min()/countDistinct()等方法来实现统计功能,如下面的代码示例:
Criteriacriteria=session.createCriteria(User.class);
criteria.setProjection(Projections.avg(“age”));(1)
Listlist=criteria.list();
Iteratorit=list.iterator();
while(it.hasNext()){
}
通过(1)处的代码,我们实现了对用户平均年龄的统计,当进行检索时,Hibernate会生成类似如下的SQL语句:
Select avg(age) fromuser;
另外,在SQL语句中的多条件分组与统计功能,可以利用ProjectionList类来实现,如下面代码所示:
Criteriacriteria=session.createCriteria(User.class);
ProjectionListprolist=Projections.projectionList();
prolist.add(Projections.groupProperty(“age”));
prolist.add(Projections.rowCount());
criteria.setProjection(prolist);
Listlist=criteria.list();
通过以上代码,实现了对不同年龄人员数量的分组统计,当进行检索时,Hibernate会生成类似如下的SQL语句:
Select age,count(*) fromuser group by age;
5、DetachedCriteria:
在Hibernate2中,Criteria实例是与创建它的Session实例具有相同的生命周期的,也就是说,Session实例是它所创建的Criteria实例的宿主,当Session关闭时,寄生于Session实例的Criteria都将失效。这就对Criteria的重用造成了困难,为了实现Criteria实例的重用,在Hibernate3中提供了一个DetachedCriteria类,DetachedCriteria实例的生命周期与Session实例的生命周期无关,我们可以利用DetachedCriteria对一些常用的Criteria查询条件进行抽离,当需要进行检索时再与Session实例关联,从而获得运行期的Criteria实例。如下面的代码所示:
DetachedCriteria也可以用于完成子查询功能,如下代码所示:
DetachedCriteria dc=DetachedCriteria.forClass(User.class);
dc.setProjection(Projections.avg(“age”));
Criteriacriteria=session.createCriteria(User.class);
criteria.add(Subqueries.propertyGt(“age”,dc));
Listlist=criteria.list();
通过Subqueries类,实现了添加子查询的功能,我们将DetachedCriteria所设定的查询条件,当作子查询添加到了运行时Criteria实例的查询条件中,当执行检索时Hibernate会生成类似如下的SQL语句:
Select * from user whereage>(select avg(age) from user group byage);
- Hibernate QBC查询
- Hibernate QBC查询
- Hibernate QBC高级查询
- Hibernate QBC高级查询
- hibernate QBC查询方式
- Hibernate QBC查询
- Hibernate QBC查询
- Hibernate QBC查询
- Hibernate QBC查询实例
- Hibernate QBC 查询
- Hibernate QBC高级查询
- Hibernate QBC高级查询 .
- Hibernate QBC查询
- hibernate QBC查询
- Hibernate QBC查询
- Hibernate之QBC查询
- Hibernate QBC查询
- Hibernate:QBC查询语言
- Linux下mysql乱码处理
- Linux 检测网卡和配置网卡信息
- Linux 开机启动脚本
- Mysql windows环境下无法进行…
- mysql linux环境下区分大小写问题
- Hibernate QBC查询
- log4j配置祥解
- Spring MultiActionControlle…
- Spring MVC 报错 N…
- 用谷歌浏览器来当手机模拟器
- linux下 mysql自动备份脚本
- bash: crontab: command not found
- Linux设置定时任务
- java类加载器