`
hong0104
  • 浏览: 17177 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

hibernate的QBC查询

阅读更多

转载   Hibernate QBC高级查询 收藏

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 Cri teria 查询表达式:

正如我们所见, 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 对象),来构造复合查询,在数据库一端是通过内连接查询来实现。

 

4 33 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(HQL、QBC查询)源码

    Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码

    Hibernate QBC高级查询.rar

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

    Hibernate_QBC查询[归类].pdf

    总结来说,Hibernate QBC查询是一种强大的查询机制,它通过Criteria API和Expression类提供了丰富的查询表达式,使得开发人员可以在不直接接触SQL的情况下进行复杂的数据库操作。这种面向对象的查询方式不仅简化了...

    Java_Hibernate QBC条件查询对比

    本篇文章将深入探讨Hibernate中的QBC(Query By Example)条件查询与传统的HQL(Hibernate Query Language)查询的对比,帮助开发者更好地理解和选择适合的查询方式。 QBC(Query By Example)是Hibernate提供的一...

    Hibernate_QBC和Hibernate_QBE

    标题"Hibernate_QBC和Hibernate_QBE"提及了两个关于Hibernate的查询方式,即Query By Criteria(QBC)和Query By Example(QBE)。Hibernate是Java领域中一个广泛使用的对象关系映射(ORM)框架,它允许开发者以面向...

    QBC的各种查询

    QBC,全称为Query By Criteria,是Java世界中一种基于对象的查询方式,主要用于简化Hibernate框架中的数据查询操作。QBC提供了一种面向对象的方式来构建查询条件,与SQL语句相比,它更易于理解和维护,尤其在处理...

    QBC_hibernate完整用法

    收录了QBC_hibernate完整用法.大家可以下载看看.作为参考.

    Hibernate QBC分页

    QBC是Hibernate提供的一种基于对象的查询方式,与HQL(Hibernate Query Language)类似,但更接近Java的API,允许我们根据对象的属性来构建查询条件。在进行分页查询时,QBC提供了`setFirstResult()`和`...

    Hibernate的查询方式

    除了HQL,Hibernate还支持QBC查询方式,这是一种基于Criteria API的查询方式,提供了更加类型安全和灵活的查询构建器。通过Criteria API,开发者可以动态地构建复杂的查询条件,而不必关心具体的SQL语法。 ##### ...

    Hibernate实例开发 HQL 与 QBC 查询

    本教程将深入探讨Hibernate中的两种查询方式:HQL(Hibernate Query Language)和QBC(Query By Example)。通过实例开发,我们将了解这两种查询方法的使用和它们之间的差异。 首先,HQL是Hibernate专门设计的一种...

    继承关系映射和HibernateQBC查询

    ### 继承关系映射和Hibernate QBC查询 #### 继承关系映射 继承作为面向对象编程的一个核心概念,在Java等面向对象语言中极为常见。然而,在数据库中表示继承关系并不直观,因为数据库通常使用表格来存储数据,而...

    QBC查询的别名方的

    ### QBC查询简介 QBC(Query By Criteria)是Hibernate提供的一种查询方式,允许开发者通过构建查询条件来动态地创建SQL查询语句。相比于传统的HQL(Hibernate Query Language),QBC提供了更加灵活且易于控制的...

    hibernate实现动态SQL查询

    为了实现动态SQL,我们可以借助于Hibernate的QBC(Query By Criteria)和Criteria API,或者使用第三方库如MyBatis的动态SQL功能。本文主要讨论使用XML配置和FREEMARKER的方法。 四、XML配置SQL 在Hibernate中,...

    Hibernate_QBC案例.rar

    查询所有 // 2.条件查询 // 3.模糊查询 // 4.范围查询 // 5.排序查询(order by) // 6.分页查询 // 7.投影查询(只获取部分字段的结果) // 8.聚集函数使用(聚合函数)(count、sum、avg、max、min等) // 9.TOP N...

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    总的来说,Hibernate的`Criteria`、`Query`以及QBC(Query By Criteria)提供了灵活且强大的查询手段,它们不仅支持基本的单表查询,还能处理复杂的联表、分页、参数绑定和统计需求,是Java开发者进行数据库操作的...

    Hibernate-HQL-QBC-QBE

    3. QBC(Query By Criteria):QBC是另一种在Hibernate中进行数据查询的方法,它基于Java的标准API(JPA的Criteria API或Hibernate的Criteria API)。QBC允许开发者构建动态查询,通过定义一组标准和约束来获取满足...

    hibernate查询详解

    3. QBC(Query By Criteria)标准查询: Criteria API提供了一种面向对象的方式来构建查询,适用于动态查询构建。它主要涉及Criteria、Criterion、Order和Restrictions等类。 A. 简单的Criteria查询: ```java ...

    hibernate查询代码

    3. **QBC(Query By Example)**: 通过实例对象来构造查询,适用于简单场景。假设你有一个`User`对象,你想找到所有和这个对象属性相匹配的用户: ```java User exampleUser = new User(); exampleUser.setAge...

    hibernate映射和查询

    Hibernate 提供了多种查询方式,包括 HQL(Hibernate Query Language)、QBC(Query By Criteria)和 JPA(Java Persistence API)的 Criteria API。这些查询语言提供了面向对象的方式来检索数据,比传统的 SQL 更加...

Global site tag (gtag.js) - Google Analytics