1、背景了解:Hibernate的三种查询方式

Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种,这里做简单的概念介绍,不详细进行展开。

1.1 HQL(Hibernate Query Language)

与所熟悉的SQL的语法差不太多,不同的就是把表名换成了类或者对象,如下示例:
@Override
public SysUser findUserByLoginName(String pLoginName) {
String hql = "from SysUser as u where u.loginName = ?";
List<SysUser> users = getHibernateTemplate().find(hql, pLoginName); //pLoginName对应?
return users.isEmpty() ? null : users.get(0);
}
6
 
1
@Override 
2
public SysUser findUserByLoginName(String pLoginName) {
3
    String hql = "from SysUser as u where u.loginName = ?";
4
    List<SysUser> users = getHibernateTemplate().find(hql, pLoginName); //pLoginName对应?
5
    return users.isEmpty() ? null : users.get(0);
6
}

1.2 SQL(Structured Query Language)

static List sql() {
  Session s = HibernateUtil.getSession();
Query q = s.createSQLQuery("select * from user").addEntity(User.class);
List<User> rs = q.list();
s.close();
return rs;
}
7
 
1
static List sql() {
2
   Session s = HibernateUtil.getSession();
3
    Query q = s.createSQLQuery("select * from user").addEntity(User.class);
4
    List<User> rs = q.list();
5
    s.close();
6
    return rs;
7
}

缺点:违背了hibernate的跨平台优点,不易维护,不面向对象。不推荐使用。

1.3 QBC(Query By Criteria)

1.3.1 QBC查询的基本步骤

这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:
  • 使用Session实例的createCriteria()方法创建Criteria对象;
  • 使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组;
  • 使用Criteria对象的list()方法进行查询并返回结果。

1.3.2 Restrictions、Order、Projections的常用方法

Restrictions类的常用方法(设置查询条件):
返回值类型 方法名称 描述
SimpleExpression Restrictions.eq 等于(equal)
Criterion Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
SimpleExpression Restrictions.gt 大于(great than)
SimpleExpression Restrictions.ge 大于等于(great than or equal)
SimpleExpression Restrictions.lt 小于(less than)
SimpleExpression Restrictions.le 小于等于(less than or equal)
Criterion Restrictions.between 对应SQL的between
SimpleExpression Restrictions.like 对应SQL的like
Criterion Restrictions.in 对应SQL的in
LogicalExpression Restrictions.and and关系
LogicalExpression Restrictions.or or关系
Criterion Restrictions.isNull 为空
Criterion Restrictions.sqlRestriction SQL限定查询

Order类的常用方法(设置排序方式):
返回值类型 方法名称 描述
Order Order.asc 升序
Order Order.desc 降序

Projections类的常用方法(统计和分组):
返回值类型 方法名称 描述
AggregateProjection Projections.avg 求平均值
CountProjection Projections.count 统计某属性的数量
CountProjection Projections.countDistinct 统计某属性不同值的数量
PropertyProjection Projections.groupProperty 指定某个属性为分组属性
AggregateProjection Projections.max 求最大值
AggregateProjection Projections.min 求最小值
ProjectionList Projections.projectionList 创建一个ProjectionList对象
Projection Projections.rowCount 查询结果集中的记录条数
AggregateProjection Projections.sum 求某属性的合计
更多方法,以及方法的详细使用及解释,请参看在线API:Hibernate API Documentation(3.2.7.ga)

1.3.3 QBC的查询示例和基本理解

接下来,基于以上的一些常用方法,我们先看两个示例:
//查询匹配的账户adminList
Criteria c=s.createCriteria(Admin.class);
c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
c.add(Restrictions.eq("apassword", password));
List<Admin> list=c.list();
5
 
1
//查询匹配的账户adminList
2
Criteria c=s.createCriteria(Admin.class);
3
c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
4
c.add(Restrictions.eq("apassword", password));
5
List<Admin> list=c.list();

//分页查询前10条
Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder( Order.asc("name") ); //排序方式
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List result = criteria.list()
6
 
1
//分页查询前10条
2
Criteria criteria = session.createCriteria(Customer.class);
3
criteria.addOrder( Order.asc("name") ); //排序方式
4
criteria.setFirstResult(0);
5
criteria.setMaxResults(10);
6
List result = criteria.list()

看到这里,流程大概很好理解,从方法名就知道无非是把各种条件往里面加最后就可以获得一个符合条件的list。那么,下面再延伸理解一下:
org.hibernate.Criteria实际上是个条件附加的容器,如果想要设定查询条件,则要使用org.hibernate.criterion.Restrictions的各种静态方法传回org.hibernate.criterion.Criterion实例,传回的每个org.hibernate.criterion.Criteria实例代表着一个条件,你要使用org.hibernate.Criteria的add()方法加入这些条件实例。下面看个示例:
//查找age等于(eq)20或(or)age为空(isNull)的User
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.or( Restrictions.eq("age", new Integer(20)), Restrictions.isNull("age") ));
List users = criteria.list(); //实际上它产生的对应的sql如下
Hibernate:
select
this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_
from
T_USER this_
where
(this_.age=? or this_.age is null)
13
 
1
//查找age等于(eq)20或(or)age为空(isNull)的User
2
Criteria criteria = session.createCriteria(User.class);
3
criteria.add(Restrictions.or( Restrictions.eq("age", new Integer(20)), Restrictions.isNull("age") ));
4
List users = criteria.list();
5

6
//实际上它产生的对应的sql如下
7
Hibernate: 
8
select 
9
    this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ 
10
from 
11
    T_USER this_ 
12
where 
13
    (this_.age=? or this_.age is null)

1.3.4 复合查询

复合查询就是在原有的查询基础上在进行查询,比如有Clazz班级,包含对象属性Student,那么我们希望查询 “包含学生姓名为Bob” 的班级,那么就可以使用复合查询:
Criteria criteria = session.createCriteria(Clazz.class);
Criteria criteriaInner = criteria.createCriteria(Student.class);
criteriaInner.add(Restrictions.eq("name", "Bob"));
List clazzList = criteria.list();
4
 
1
Criteria criteria = session.createCriteria(Clazz.class);
2
Criteria criteriaInner = criteria.createCriteria(Student.class);
3
criteriaInner.add(Restrictions.eq("name", "Bob"));
4
List clazzList =  criteria.list();

如果是DetachedCriteria,则是根据关联属性的名称,而非Class,如:
Member member = MemberHelper.getCurrentLoginMember();
DetachedCriteria criteria = DetachedCriteria.forClass(Picture.class);
DetachedCriteria collectCriteria = criteria.createCriteria("collectRecordList");
collectCriteria.add(Restrictions.eq("member", member));
List<Picture> pictureList = Picture.listByCriteria(criteria, page, Order.desc("updateDate"));
5
 
1
Member member = MemberHelper.getCurrentLoginMember();
2
DetachedCriteria criteria = DetachedCriteria.forClass(Picture.class);
3
DetachedCriteria collectCriteria = criteria.createCriteria("collectRecordList");
4
collectCriteria.add(Restrictions.eq("member", member));
5
List<Picture> pictureList = Picture.listByCriteria(criteria, page, Order.desc("updateDate"));

1.3.5 Hibernate中Criteria方式的基本使用流程

所以,基于以上的的示例和理解,我们不难看出Criteria的基本使用流程:


2、DetachedCriteria是什么,和Criteria有什么区别

父接口CriteriaSpecification,其下有子接口Criteria和实现类DetachedCriteria,Criteria和DetachedCriteria均可使用Criterion和Projection设置查询条件。可以设置FetchMode( 联合查询抓取的模式 ) ,设置排序方式。对于Criteria还可以设置FlushModel(冲刷 Session 的方式)和LockMode(数据库锁模式)。

Criteria和DetachedCriteria的主要区别在于创建的形式不一样,Criteria是在线的,所以它是由Hibernate Session进行创建的;而DetachedCriteria是离线的,创建时无需Session,它通过2个静态方法forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 的实例创建。

(另,Spring的框架提供了getHibernateTemplate ().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria来返回查询结果)

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

3、DetachedCriteria的基本使用

上面已经提到,Criteria和DetachedCriteria均可使用Criterion和Projection设置查询条件,设置排序方式。那么这里也无需过度展开,以一个简单的例子来示意吧:
//查询id为1且在今天或今天之前出生的user的名单
//1、创建DetachedCriteria并设置条件
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
int id = 1;
dc.add(Restrictions.eq("id", id));
Date age = new Date();
dc.add(Restrictions.le("birthday", age)); //2、执行查询(Criteria getExecutableCriteria(Session session))
Session session = HibernateUtil.getSession();
Criteria c = dc.getExecutableCriteria(session);
List users = c.list();
12
 
1
//查询id为1且在今天或今天之前出生的user的名单
2
//1、创建DetachedCriteria并设置条件
3
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
4
int id = 1;
5
dc.add(Restrictions.eq("id", id));
6
Date age = new Date();
7
dc.add(Restrictions.le("birthday", age));
8

9
//2、执行查询(Criteria   getExecutableCriteria(Session session))
10
Session session = HibernateUtil.getSession();
11
Criteria c = dc.getExecutableCriteria(session);
12
List users = c.list();

这里值得一提的是,DetachedCriteria并没有像Criteria一样有list()的方法来返回List,所以需要以此获取一个可执行的Criteria,达到真正执行查询的目的,我们看下官方的解释:
org.hibernate.criterion

Class DetachedCriteria

getExecutableCriteria

public Criteria getExecutableCriteria(Session session)
Get an executable instance of Criteria, to actually run the query.
x
 
1
org.hibernate.criterion
2

3
Class DetachedCriteria
4

5
getExecutableCriteria
6

7
public Criteria getExecutableCriteria(Session session)
8
Get an executable instance of Criteria, to actually run the query.

4、参考链接



Hibernate的DetachedCriteria使用(含Criteria)的更多相关文章

  1. Hibernate的DetachedCriteria使用(含Criteria)转载

    https://www.cnblogs.com/deng-cc/p/6428599.html 1.背景了解:Hibernate的三种查询方式 Hibernate总的来说共有三种查询方式:HQL.QBC ...

  2. JavaWeb_(Hibernate框架)Hibernate中数据查询语句Criteria基本用法

    Criteria进行数据查询与HQL和SQL的区别是Criteria完全是面向对象的方式在进行数据查询,将不再看到有sql语句的痕迹,使用Criteria 查询数据包括以下步骤: 1. 通过sessi ...

  3. 五 Hibernate的其他API,Query&Criteria&SQLQuery

    Query Criteria SQLQuery Query接口:用于接收HQL,用于查询多个对象 HQL:Hibernate Query Language  Query条件查询: Query分页查询: ...

  4. Hibernate 、Hql查询和Criteria查询

    HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ...

  5. hibernate的QBC查询之Criteria用法

    //return (DeliverCost) super.getSession().createCriteria(getMyClass()).add(Restrictions.eq("isd ...

  6. 转:Hibernate中Criteria和DetachedCriteria的完整用法

    原文地址:http://blog.sina.com.cn/s/blog_667528fd0100rkrf.html 设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 H ...

  7. Hibernate中Criteria的完整用法

    1,CriteriaHibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria .2,De ...

  8. 【hibernate criteria】hibernate中criteria的完整用法 转

    ---恢复内容开始--- 转自:http://www.360doc.com/content/090313/10/26262_2794855.html 1.Criteria Hibernate 设计了 ...

  9. Hibernate框架之Criteria查询

    首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ...

随机推荐

  1. JS中的函数、BOM和DOM操作

     一.JS中的函数 [关于注释] /** [文档注释]:开头两个*.写在函数上方,在调用函数时可以看到文档上方的描述信息. */   // 单行注释 /* 多行注释 */ 1.函数的声明及调用 (1) ...

  2. VMware Workstation 12 Pro 之安装林耐斯-LinuxMint-系统

    VMware Workstation 12 Pro 之安装林耐斯-LinuxMint-系统... ---------------------- ---------------------------- ...

  3. Ecshop商品描述上传中文名图片无法显示解决方法

    在后台上传商品图片的时候,如果你选择一个中文名称的图片,那么上传后会产生乱码,导致图片显示不出来. 下面说一种解决办法:使用"年月日时分秒 + 6个随机字符"做为文件名,如 201 ...

  4. SpringMVC的@RequestParam的解释

    自SpringMVC4.2之后,RequestParam内部有4个参数: 1.String name 2.String value 3.boolean required 4.String defaul ...

  5. JavaSE二次学习之标识符和编程命名相关的内容

    前段时间阿里开源了<阿里巴巴 JAVA 开发手册>,里面详细叙述了有关编程命名.sql规约.工程规约等内容,作为一个初学者,只讨论一下-编程规约-的部分. 这几天又重新回去看了看JavaS ...

  6. 中间件学习之RMI+JDBC远端数据库的访问

    问题: RMI+JDBC远端数据库的访问.实现简单的成绩查询系统(创建表,录入成绩,查询成绩等).在服务器端,通过JDBC访问数据库.客户端调用服务端提供的各种数据库操作. 环境准备: (1).确保J ...

  7. Shuffle 的 5步

    Shuffle的本意是洗牌.混乱的意思,类似于java中的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序.MapReduce中的Shuffle过程.所谓 ...

  8. POI设置excel某列值为文本格式

    excel单元格格式默认为[常规],当某列限定必须从下拉框选择一个纯数字文本的时候,必须将单元格格式设置为[文本]. 否则即使输入的值和下拉框的一致,excel都认为输入的值是常规类型,而下拉框的值为 ...

  9. 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析

    异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环. 异常有两个过程,一个是抛出异常:一个是捕捉异常. 抛出异常 抛出异常有三种形式,一是throw, ...

  10. 深入浅出数据结构C语言版(16)——插入排序

    从这一篇博文开始,我们将开始讨论排序算法.所谓排序算法,就是将给定数据根据关键字进行排序,最终实现数据依照关键字从小到大或从大到小的顺序存储.而这篇博文,就是要介绍一种简单的排序算法--插入排序(In ...