https://www.cnblogs.com/deng-cc/p/6428599.html

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

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

1.1 HQL(Hibernate Query Language)

与所熟悉的SQL的语法差不太多,不同的就是把表名换成了类或者对象,如下示例:
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)

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的查询示例和基本理解

接下来,基于以上的一些常用方法,我们先看两个示例:
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();

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()方法加入这些条件实例。下面看个示例:
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” 的班级,那么就可以使用复合查询:
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,如:
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的基本使用流程:
  • Criteria创建 --> session.createCriteria(Class persistentClass)  (更多重载参考)
  • 条件添加 --> add(Criterion criterion) 限定条件、 addOrder(Order order) 限定顺序、 setProjection(Projection projection) 限定统计动作
  • 结果返回 --> list()

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设置查询条件,设置排序方式。那么这里也无需过度展开,以一个简单的例子来示意吧:
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,达到真正执行查询的目的,我们看下官方的解释:
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 查询方式汇总
  • * Hibernate 中Criteria 的使用介绍
  • Hibernate中DetachedCriteria的使用
  • Hibernate框架之Criteria查询 和注解

转载于:https://www.cnblogs.com/Jeely/p/11130952.html

Hibernate的DetachedCriteria使用(含Criteria)转载相关推荐

  1. Hibernate的DetachedCriteria使用(含Criteria)

    1.背景了解:Hibernate的三种查询方式 Hibernate总的来说共有三种查询方式:HQL.QBC和SQL三种,这里做简单的概念介绍,不详细进行展开. 1.1 HQL(Hibernate Qu ...

  2. hibernate学习之四——Query和Criteria接口

    Query 和 Criteria 接口是 Hibernate 的查询接口,用于向数据库查询对象以及控制执行查询的过程. Query 实例包装了一个 HQL(Hibernate Query Langua ...

  3. Hibernate之DetachedCriteria类详解

    首先看DetachedCriteria这个类名,是由两个单词(detached和criteria)组成的,Criteria咱们知道是QBC查询主要接口之一,它通过组装各种Criterion对象来获取实 ...

  4. Hibernate事实:始终检查Criteria API SQL查询

    Criteria API对于动态构建查询非常有用,但这是我使用它的唯一用例. 每当您有一个带有N个过滤器且可以以任意M个组合到达的UI时,就应该有一个API动态地构造查询,因为连接字符串始终是我所不愿 ...

  5. 391、Java框架46 -【Hibernate - 查询HQL、查询Criteria、查询标准SQL】 2020.10.19

    0.目录 1.HQL 2.使用HQL,根据name进行模糊查询 3.查询Criteria 4.使用Criteria,根据name进行模糊查询 5.查询-标准SQL 6.使用标准SQL,根据name进行 ...

  6. 2018最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)--转载

    版权声明:本文为转载文章,感谢博主小胖梅的博客,如有侵权,请联系我删除,谢谢 转载链接: https://blog.csdn.net/xm1037782843/article/details/8070 ...

  7. Hibernate 框架(三)—— Criteria 查询(Criteria 5.2以前和5.2以后的API和使用)

    文章目录 一.Criteria 查询 1.Criteria 查询概述 2.Criteria 5.2 以前的API和使用 3.Criteria 5.2 以后的API和使用 一.Criteria 查询 1 ...

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

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

  9. hibernate中criteria的一些用法

    最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法 设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 ...

最新文章

  1. Matplotlib基本用法
  2. 【网页前端设计Front end】JavaScript教程.下(看不懂你来打我)
  3. Qt警告提示:找不到“stddef.h”头文件,操蛋得很~~~
  4. 笔记-信息系统安全管理-计算机信息安全保护等级划分准则
  5. pandas删除数据库 python_Python常见的科学计算库
  6. form子句语法错误_用示例语法解释SQL的子句
  7. FPGA+NIOS2 Verilog+C 实现一个计算器
  8. MySQL——优化ORDER BY语句
  9. 【路面分类】基于matlab灰度共生矩阵图形纹理检测+SVM路面状况分类【含Matlab源码 1519期】
  10. 601. 体育馆的人流量
  11. dev万能头文件_Dev c++ 支持bits/stdc++.h万能头文件吗
  12. 普通硬盘和固态硬盘的区别?
  13. 小区市话配套和宽带接入系统研究报告
  14. 五款宝藏浏览器插件推荐,一定要看到最后
  15. PDF Shaper Professional v11.3 全能PDF工具箱单文件版
  16. 最佳Outlook 2007改进-包括日历
  17. poky: PACKAGECONFIG的用法
  18. 基于 Flink + Kafka 的实时数仓建设实践(附源码)
  19. 基于C#弹幕类射击游戏的实现——(六)爆炸效果
  20. 软件单元测试操作步骤(java版)

热门文章

  1. vs2012创建的数据库中的表怎么都不能保存的
  2. 执行若依(ruoyi)项目
  3. 基于PLC的污水处理系统
  4. 效率倍增,5 个提高生产力的 Jupyter notebook插件
  5. 打开APP validate fail
  6. linux管理web项目目录结构图,WEB项目管理完整.doc
  7. 简单的android小程序计算机,Android实现简易计算器小程序
  8. sld样式文件demo
  9. 分布式能源的不确定性——风速测试(Matlab代码实现)
  10. MT管理器解锁某APP部分功能