`

Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

阅读更多

HQL查询方式

这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。

示例:
   1: Session session = SessionFactory.getCurrentSession();
   2: User user = null;
   3: Transaction ts = session.beginTransaction();
   4: try {
   5:     Query query = session.createQuery("from User as u where name='ijse'");
   6:     user= (User) query.list().get(0);
   7:     session.commit();
   8: } catch (HibernateException ex) {
   9:     ts.rollBack();
  10:     ex.printStackTrace();
  11: }
  12: System.out.println(user.getName());

QBC(Query By Criteria) 查询方式

这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:

  1. 使用Session实例 的createCriteria()方法创建Criteria对象
  2. 使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。
  3. 使用Criteria对象的list()方法进行查询并返回结果

Restrictions类的常用方法:

方法名称
描述
Restrictions.eq 等于
Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
Restrictions.gt 大于
Restrictions.ge 大于等于
Restrictions.lt 小于
Restrictions.le 小于等于
Restrictions.between 对应SQL的between
Restrictions.like 对应SQL的like
Restrictions.in 对应SQL的in
Restrictions.and and关系
Restrictions.or or关系
Restrictions.sqlRestriction SQL限定查询

 

Order类的常用方法:

方法名称
描述
Order.asc 升序
Order.desc 降序

 

Projections类的常用方法

方法名称
描述
Projections.avg 求平均值
Projections.count 统计某属性的数量
Projections.countDistinct 统计某属性不同值的数量
Projections.groupProperty 指定某个属性为分组属性
Projections.max 求最大值
Projections.min 求最小值
Projections.projectionList 创建一个ProjectionList对象
Projections.rowCount 查询结果集中的记录条数
Projections.sum 求某属性的合计

 

示例: 
   1: Session session = SessionFactory.getCurrentSession();
   2: User user = null;
   3: Transaction ts = session.beginTransaction();
   4: try {
   5:     Criteria criteria = session.createCriteria(User.class);
   6:     criteria.add(Restrictions.eq("name","ijse"));
   7:     user= (User) criteria.list().get(0);    
   8:     session.commit();
   9: } catch (HibernateException ex) {
  10:     ts.rollBack();
  11:     ex.printStackTrace();
  12: }
  13: System.out.println(user.getName());

QBE(Query By Example)查询方式

将一个对象的非空属性作为查询条件进行查询。

示例: 
   1: Session session = SessionFactory.getCurrentSession();
   2: User user = new User();
   3: user.setName("ijse");
   4: Transaction ts = session.beginTransaction();
   5: try {
   6:     Criteria criteria = session.createCriteria(User.class);
   7:     criteria.add(Example.create(user));
   8:     user= (User) criteria.list().get(0);    
   9:     session.commit();
  10: } catch (HibernateException ex) {
  11:     ts.rollBack();
  12:     ex.printStackTrace();
  13: }
  14: System.out.println(user.getName());

离线查询

离线查询就是建立一个DetachedCriteria对象,将查询的条件等指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。

示例: 
   1: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
   2: detachedCriteria.add(Restrictions.eq("name","ijse");
   3:  
   4: Session session = SessionFactory.getCurrentSession();
   5: User user = new User();
   6: Transaction ts = session.beginTransaction();
   7: try {
   8:     Criteria criteria = detachedCriteria.getExecutableCriteria(session);
   9:     user= (User) criteria.list().get(0);    
  10:     session.commit();
  11: } catch (HibernateException ex) {
  12:     ts.rollBack();
  13:     ex.printStackTrace();
  14: }
  15: System.out.println(user.getName());

复合查询

复合查询就是在原有查询的基础上再进行查询,可以调用Criteria对象的createCriteria()方法在这个Criteria对象的基础上再进行查询。

示例: 
   1: Session session = SessionFactory.getCurrentSession();
   2: User user = new 
   3: User();
   4: Transaction ts = session.beginTransaction();
   5: try 
   6: {
   7:  Criteria criteria1 = 
   8: session.createCriteria(Room.class);
   9: Criteria 
  10: criteria2 =criterial1.createCriteria("User");
  11:  
  12: criteria2.add(Restrictions.eq("name",new String("ijse"));
  13:  
  14: user= (User) criteria.list().get(0); 
  15:  
  16: session.commit();
  17: } catch (HibernateException ex) {
  18:  
  19: ts.rollBack();
  20:  
  21: ex.printStackTrace();
  22: }
  23: System.out.println(user.getName());

分页查询

分页查询主要是要指定两个参数:从第几条数据开始,取多少条数据。可以通过调用Query或者Criteria对象的setFirstResult()和setMaxResults()方法分别进行设定。

示例: 
   1: Session session = SessionFactory.getCurrentSession();
   2: List userList = null;
   3: Transaction ts = session.beginTransaction();
   4: try {
   5:     Criteria criteria = session.createCriteria(User.class);
   6:     criteria.setFirstResult(0);//从第一个数据开始
   7:     criteria.setMaxResults(10);//取10条记录
   8:     userList = (List) criterial.list();   
   9:     session.commit();
  10: } catch (HibernateException ex) {
  11:     ts.rollBack();
  12:     ex.printStackTrace();
  13: }
转自:http://blog.csdn.net/iijse/article/details/6161143

分享到:
评论

相关推荐

    Hibernate_QBC和Hibernate_QBE

    总结来说,QBC和QBE是Hibernate提供的两种实用查询方式,分别适合不同的场景。QBC适用于需要动态构建查询条件的场合,而QBE则在简单查询中表现出其易用性。理解和掌握这两种查询方式,对于提升Hibernate开发效率和...

    QBC QBE查询

    QBC(Query By Example)和QBE(Query By Example)是两种在ORM(Object-Relational Mapping)框架中,特别是Hibernate中使用的查询方法。这两种查询方式都是为了简化SQL语句的编写,使得开发者能更专注于业务逻辑,...

    hibernate查询

    在 Hibernate 中进行查询是其核心功能之一,本文将详细介绍 Hibernate 的几种查询方式,包括 HQL (Hibernate Query Language) 查询、QBC (Query By Criteria) 查询以及 QBE (Query By Example) 查询,并结合示例代码...

    分页查询小节

    在本节中,我们将深入探讨Hibernate中的分页查询,特别是在使用QBE(Query By Example)检索方式时如何实现。QBE是一种相对简单的查询方法,它允许我们基于一个对象实例的属性来查找匹配的数据。虽然它的功能较为...

    java之hibernate和spring技术难点及其要点总结

    - **HQL**(Hibernate Query Language):一种面向对象的查询语言,类似于SQL,但更接近于Java对象的语法结构。 - **QBC**(Query By Criteria):通过Criteria API来构建查询条件。 - **QBE**(Query By Example...

    hibernate和spring技术难点及其要点总结

    1. **HQL(Hibernate Query Language)**:类似于SQL,但面向对象,支持条件查询、分页、连接查询和嵌套查询。 2. **QBC(Query By Criteria)**:基于对象的查询,通过Criteria API构建查询条件。 3. **QBE(Query ...

    Hibernate中Criteria的完整用法

    在Java的持久化框架Hibernate中,Criteria API提供了一种动态构造SQL查询的方式,它允许开发者在运行时构建灵活的查询,而无需预先编写HQL(Hibernate Query Language)语句。Criteria API提供了丰富的功能,包括...

Global site tag (gtag.js) - Google Analytics