首先看DetachedCriteria这个类名,是由两个单词(detached和criteria)组成的,Criteria咱们知道是QBC查询主要接口之一,它通过组装各种Criterion对象来获取实体,Hibernate中的Session是产生Criteria的工厂,Criterion实例一般来说都是通过Restrictions类获取的,如下面这个例子:

List cats = session.createCriteria(Cat.class).add( Restrictions.like("name", "Iz%") ).add( Restrictions.gt( "weight", new Float(minWeight) ) ).addOrder( Order.asc("age") ).list();

通过上述例子可以发现需要使用Session实例来获取Criteria对象,再看另外一个单词detached,意思为“分离的、分开的、分割的、未绑定依附的”意思,那到底跟谁分离、分开呢?对,就是session,也就是说两个单词合起来的意思是该类除了创建时不在依附于任何Session,但可以完整支持Criteria的功能,这就是DetachedCriteria的诞生的根本需求;

下面咱们再来讨论下该类的应用场景:

在常规的Web编程中,有大量的动态条件查询,即用户在网页上面根据自身需要选择录入某些条件,程序根据用户选择内容,动态生成查询SQL语句,进行查询。
  针对这种需求,对于分层应用程序来说,Web层需要传递一个包含了查询的条件条件的列表给业务层对象(传统上使用Map对象),业务层对象获得这个条件列表之后,依次从列表取出条件,构造查询语句。这里的一个难点是条件列表用什么来构造?那么这么做的缺陷就是Map对象可以传递的信息非常有限,只能传递name和value,无法传递究竟要做怎样的条件运算,即这么name和value之间什么关系,是>,<,IN,AND,OR呢?这就要求业务层对象必须确切掌握每条entry的隐含条件。因此一旦隐含条件改变,业务层对象的查询构造算法必须相应修改,但是这种查询条件的改变是隐式约定的,而不是程序代码约束的,因此非常容易出错。DetachedCriteria的出现解决了上述问题;

下面介绍一下DetachedCriteria的日常使用;

1、DetachedCriteria类允许你在Hibernate的Session范围外创建一个查询,然后使用任意一个Session环境去执行它,这种用法也是使用最多的用法,该类提供了如下两个方法用以构建DetachedCriteria对象

代码如下:

 // 创建DetachedCriteria对象DetachedCriteria query = DetachedCriteria.forClass(Cat.class).add( Property.forName("sex").eq('F') );// 获取Session对象Session session = ....;// 开启事务Transaction txn = session.beginTransaction();// 将DetachedCriteria查询对象与可执行的Criteria实例关联起来List results = query.getExecutableCriteria(session).setMaxResults(100).list();// 提交事务txn.commit();// 关闭Session,释放资源session.close();

2、一个DetachedCriteria可用作子查询,Criterion实例可以通过Subqueries和Property类调用DetachedCriteria构建的子查询,如下代码所示:

 // 构建所有Cat中的平均体重DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class).setProjection(Property.forName("weight").avg());// 获取所有Cat中,高于平均提供的Cat的集合session.createCriteria(Cat.class).add(Property.forName("weight").gt(avgWeight)).list();
 // 构建所有Cat的提供集合列表DetachedCriteria weights = DetachedCriteria.forClass(Cat.class).setProjection(Property.forName("weight"));// 获取所有Cat中,体重最大的Catsession.createCriteria(Cat.class).add(Subqueries.geAll("weight", weights)).list();}

关联子查询,即DetachedCriteria构建的子查询和Criteria构建的查询也可以直接交互,如下:

 DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2").setProjection(Property.forName("weight").avg()).add(Property.forName("cat2.sex").eqProperty("cat.sex"));session.createCriteria(Cat.class,"cat").add(Property.forName("weight").gt(avgWeightForSex)).list();

最后在上一个当用DetachedCriteria构建的投影,有多个列的例子:

 DetachedCriteria sizeQuery = DetachedCriteria.forClass(SlEmployee.class).setProjection(Projections.projectionList().add(Projections.property("userName")).add(Projections.property("employeeName"))).add(Restrictions.eq("userName", "CHENGYU"));List list = session.createCriteria(SlEmployee.class).add(Subqueries.propertiesEq(new String[] { "userName", "employeeName" }, sizeQuery)).list();

实际项目中用的最多的是第一种用法,即用来构建一个查询对象,对于子查询这种用法则用的较少,通过例子可以看出,子查询的功能似乎才更能体现出DetachedCriteria的强大!!

Hibernate之DetachedCriteria类详解相关推荐

  1. hibernate.hbm2ddl.auto配置详解

    hibernate.hbm2ddl.auto配置详解 http://www.cnblogs.com/feilong3540717/archive/2011/12/19/2293038.html hib ...

  2. Hibernate对象关系映射详解之一对多关系映射

    Hibernate对象关系映射详解之"一对多"关系映射 之前学习Hibernate框架的时候,对这七大关系映射一直是云里雾里的,虽然可以仿照写出代码,但是不能独立编写出来.鉴于工作 ...

  3. Hibernate Validation校验注解详解

    在前后端传递数据的时候,往往后端需要校验传递数据的格式,比如用户名的格式,密码是否为空.我们可以在service层编写代码判断,但是当我们在多处需要校验传递来的数据的时候,就会出现大量重复的代码,一旦 ...

  4. JDBC从入门到熟练使用——功能类详解、增删改查(CRUD)、sql注入、事务、连接池

    一.JDBC入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问 ...

  5. OpenCV Mat类详解和用法(官网原文)

    参考文章:OpenCV Mat类详解和用法 我马克一下,日后更 官网原文链接:https://docs.opencv.org/3.2.0/d6/d6d/tutorial_mat_the_basic_i ...

  6. 转载:c+string类详解

    C++ string 类详解 </h1><div class="clear"></div><div class="postBod ...

  7. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  8. JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  9. Android复习14【高级编程:推荐网址、抠图片上的某一角下来、Bitmap引起的OOM问题、三个绘图工具类详解、画线条、Canvas API详解(平移、旋转、缩放、倾斜)、矩阵详解】

    目   录 推荐网址 抠图片上的某一角下来 8.2.2 Bitmap引起的OOM问题 8.3.1 三个绘图工具类详解 画线条 8.3.16 Canvas API详解(Part 1) 1.transla ...

最新文章

  1. 智源青年科学家林乾:揭开人工智能的黑匣,从解答最基本的问题开始
  2. python读取二进制数据中的while循环_在Python中读取二进制文件并循环遍历每个字节...
  3. android blockcanary 原理,blockCanary原理
  4. java ucs2转utf8_Windows下Unicode(UCS2),UTF8,GBK(GB2312)互转
  5. mysql多数据源事务_多数据源一致性事务解决方案
  6. antd vue关闭模态对话框_Vue.extend 登录注册模态框
  7. python websocket django vue_Django资料 Vue实现网页前端实时反馈输出信息
  8. 机器视觉光源学习总结——平行背光源
  9. Windows Mobile 6 模拟器绿色中文版
  10. ensp由于win10 ARP表项未过期导致网络不通排查
  11. matlab 元胞数组
  12. 网页表格局部数据比对变色
  13. 使用tcpdump抓取DNS包
  14. [小物分享] “Cap-less”——烂笔头3088
  15. 国土空间生态修复规划简介
  16. 中继 并发量_潮流UCM6102 IP PBX 支持500门分机 双外线 30个并发数
  17. 蓄水池问题c语言编程,蓄水池算法(Reservoir Sampling)
  18. 使用samba服务在Linux与Windows直接共享文件夹,海康威视网络摄像头录像视频存储到ubuntu服务器
  19. mysql 1分钟前_mysql 数据库取前后几秒 几分钟 几小时 几天的语句
  20. 想成为小说家?这款儿童键盘让我的创作欲爆棚!

热门文章

  1. ZCTF2015 pwn试题分析
  2. 京东投票项目开发笔记
  3. 用elemet-ui组件实现弹窗里的树形结构和拖拽功能
  4. 关于vue中sync修饰符的用法
  5. java中容易混淆的方法_java中容易混淆的区别
  6. Angular Model
  7. java获取运行时对象,java 面向对象(四十一):反射(五)反射应用二:获取运行时类的完整结构...
  8. oracle 视图及函数授权,Oracle常见1000问之内部函数及管理视图
  9. [转]EXCEL截取字符串中某几位的函数——LeftMIDRight及Find函数的使用
  10. Python -- sys模块