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);
|
相关推荐
Hibernate 的 Criteria 用法...Hibernate 的 Criteria 是一个强大的查询工具,提供了灵活的查询条件组装方式,能够满足开发中复杂的查询需求。通过本文的总结,开发者可以更好地使用 Criteria 来实现复杂的查询操作。
在Java持久层框架Hibernate中,Criteria API是一种动态构建SQL查询的方法,它允许开发者在运行时构建查询,提供了更面向对象的查询方式。本篇将详细阐述Hibernate Criteria API的使用。 首先,Criteria API由...
在Hibernate框架中,Criteria查询是除HQL之外的另一种常用查询方式。 #### 二、Criteria 接口 `org.hibernate.Criteria` 接口代表了针对某个特定持久化类的查询。在Hibernate中,可以通过`Session` 对象的 `...
本文将对 Hibernate 中 Criteria 的用法进行总结,涵盖 Criteria 和 DetachedCriteria 的差异、Criterion 和 Projection 的使用方法等。 Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供...
总结起来,Hibernate的Criteria API提供了一种灵活、强大的方式来动态构建数据库查询,同时保持代码的简洁性和可读性。通过理解并熟练运用上述知识点,开发者可以在实际项目中更加有效地管理数据查询。
在Hibernate中,利用Criteria API进行模糊查询,可以更加方便地实现这一功能。 ### 使用Hibernate-Criteria进行模糊查询 #### 准备工作 首先,确保项目中已经引入了Hibernate相关的依赖库,并且配置好了实体类与...
本文将围绕给定的代码片段,深入探讨Hibernate Criteria API中排序功能的使用方法与注意事项。 #### 二、基础知识回顾 在开始之前,我们先简单回顾一下Hibernate Criteria API的基础知识: - **Criteria API**:...
而在Hibernate提供的多种查询方式中,Criteria API是一种非常灵活且强大的查询工具,它支持复杂的条件组合以及分组、排序等功能,为开发者提供了更为方便的查询手段。 #### 二、Criteria简介 Criteria是Hibernate...
在Java的持久化技术中,Hibernate作为ORM(对象关系映射)框架的一种,提供了强大的数据访问能力。而其中的`Criteria`接口更是为复杂的查询需求提供了一种灵活且功能强大的解决方案。本文将深入探讨`Hibernate-...
总结来说,Hibernate的Criteria API为Java开发人员提供了一种强大的、灵活的查询机制,使得我们可以以面向对象的方式来构建和执行SQL查询,极大地提升了代码的可读性和可维护性。结合源码理解和版本控制工具,可以...
总结,Criteria Hibernate是Hibernate框架中一个强大的查询工具,通过面向对象的方式构建查询,极大地提高了代码的可读性和可维护性。理解和掌握Criteria API,对于提升Java开发者在ORM领域的专业技能至关重要。
在Hibernate中,`inverse`属性是一个关键的概念,它用于定义一对多或多对一关系中的维护端。`inverse="true"`表示另一端负责维护关联关系,这在处理关联实体的保存和更新时具有重要意义。例如,如果你有一个学生类和...
整体总结Hibernate中的Criteria的用法!
在 Hibernate 中,Criteria API 提供了一种类型安全的方式来构建动态查询,与 HQL 相比,它更加面向对象,并且支持更复杂的查询条件。 #### 二、基本概念 1. **Criteria**:`org.hibernate.Criteria` 接口是 ...
在Java持久化框架Hibernate中,Criteria API是一种强大的查询工具,它允许开发者以面向对象的方式构建SQL查询,从而避免了直接编写SQL语句的繁琐工作。Criteria API在Hibernate 3.0版本中得到了广泛应用,提供了更...
**标题:“Hibernate课程的总结”** 在学习Hibernate框架的过程中,我们深入探讨了它在Java企业级应用中的核心地位。Hibernate作为一个强大的对象关系映射(ORM)工具,它简化了数据库与Java对象之间的交互,消除了...