Hibernate框架Criteria查询
本文章适合一些初学者
一、使用Criteria查询数据
1.条件查询
1.1:使用Criteria查询的步骤
1.使用Session接口的creatCriteria()方法创建Criteria对象
2.使用Restrictions类提供的静态方法设置条件,这些静态方法返回Criterion对象,一个
Criterion对象代表一个查询条件,Criteria接口的add()方法用来添加查询方法
3.使用Criteria接口的list()方法执行查询语句,list()方法返回java.util.List类型的
结果,List集合中每个元素都是持久化对象
eg:(1) 使用Criteria查询所有的部门
Criteria criteria = session.createCriteria(Dept.class).list();
(2) 查询部门在“西一区”的部门
Criteria criteria = session.createCriteria(Dept.class).add(Restrictions.eq("location","西一区")).list();
(3) add(Restrictions.eq("location","西一区")).ignoreCase();
ignoreCase():表示 不区分大小写
1.2:HQL和Criteria支持的比较运算
----------------------------------------------------------------------------------------
HQL运算符 Criteria运算方法 说明
----------------------------------------------------------------------------------------
= SimpleExpression Restrictions.eq(String propertyName,Object value) 等于
----------------------------------------------------------------------------------------
<> SimpleExpression Restrictions.ne(String propertyName,Object value) 不等于
----------------------------------------------------------------------------------------
> SimpleExpression Restrictions.gt(String propertyName,Object value) 大于
----------------------------------------------------------------------------------------
>= SimpleExpression Restrictions.ge(String propertyName,Object value) 大于等于
----------------------------------------------------------------------------------------
< SimpleExpression Restrictions.lt(String propertyName,Object value) 小于
----------------------------------------------------------------------------------------
<= SimpleExpression Restrictions.le(String propertyName,Object value) 小于等于
----------------------------------------------------------------------------------------
is null Criterion Restrictions.isNull(String propertyName) 等于空值
----------------------------------------------------------------------------------------
is not null Criterion Restrictions.isNotNull(String propertyName) 非空值
----------------------------------------------------------------------------------------
1.3:HQL和Criteria支持的范围运算
----------------------------------------------------------------------------------------
HQL运算符 Criteria运算方法 说明
----------------------------------------------------------------------------------------
in(列表) Criterion Restrictions.in(String propertyName,Collection values)
或Criterion Restrictions.in(String propertyName,Object[] values) 等于列表中的某一个值
----------------------------------------------------------------------------------------
not in(列表) Criterion Restrictions.not(Restrictions.in()) 不等于列表中的任意一个值
----------------------------------------------------------------------------------------
between 值1 and 值2 Criterion Restrictions.between(String propertyName,Object lo,Object hi) 大于等于值1并且小于值2
----------------------------------------------------------------------------------------
not between 值1 and 值2 Criterion Restrictions.not(Restrictions.between()) 小于值1并且大于值2
1.4:HQL和Criteria支持的字符串模式匹配
----------------------------------------------------------------------------------------
HQL运算符 Criteria运算方法 说明
----------------------------------------------------------------------------------------
|SimpleExpression Restrictions.like(String propertyName,Object value)
|或 字符串模式匹配
|SimpleExpression Restrictions.like(String propertyName,Object value,MatchMode
| matchMode)
|-------------------------------------------------------------------------------
like |Criterion Restrictions.ilike(String propertyName,Collection values)
|或 字符串模式匹配,同时忽略大小写
|Criterion Restrictions.in(String propertyName,String value,MatchMode matchMode)
|
----------------------------------------------------------------------------------------
1.5:MatchMode类的静态常量
----------------------------------------------------------------------------------------
模式 举例 说明
----------------------------------------------------------------------------------------
MatchMode.Start Restrictions.like("empName","s",MatchMode.start) 员工姓名以“s”开头
----------------------------------------------------------------------------------------
MatchMode.end Restrictions.end("empName","s",MatchMode.end) 员工姓名以“s”结尾
----------------------------------------------------------------------------------------
MatchMode.anywhere Restrictions.anywhere("empName","s",MatchMode.anywhere) 员工姓名中包含“s”
----------------------------------------------------------------------------------------
MatchMode.exact Restrictions.anywhere("empName","s",MatchMode.exact) 员工姓名中等于“s”,精确匹配
----------------------------------------------------------------------------------------
1.6:HQL和Criteria支持的逻辑方法
----------------------------------------------------------------------------------------
HQL运算符 Criteria运算方法 说明
----------------------------------------------------------------------------------------
and LogicalExpression Restrictions.and(Criterion lhs,Criterion rhs) 逻辑与
----------------------------------------------------------------------------------------
or LogicalExpression Restrictions.or(Criterion lhs,Criterion rhs)
或Disjunction Restritions.disjunction() 逻辑或
----------------------------------------------------------------------------------------
not Criterion Restrictions.not(Criterion expression) 逻辑非
1.7:HQL和Criteria支持的集合运算
----------------------------------------------------------------------------------------
模式 举例 说明
----------------------------------------------------------------------------------------
is empty Criterion Restritions.isEmpty(String properName) 集合为空,不包含任何元素
----------------------------------------------------------------------------------------
is not empty Criterion Restritions.isNotEmpty(String properName) 集合不为空
2.动态查询(封装条件类)
二、排序、分页及关联 .addOrder(Order.asc("salary")).list();
排序: eg: List<Emp> list = session.createCriteria(Emp.class).add(Restrictions.gt("salary",4000D))
.addOrder(Order.asc("salary")).list();
分页: eg: List<Emp> list = session.createCriteria(Emp.class).add(Restrictions.gt("salary",4000D))
.addOrder(Order.asc("salary")).setFirstResult(0).setMaxResult(2).list();
三、查询唯一对象
Query和Criteria接口执行查询语句的方法
------------------------------------------------------------------------------------------------
方法 说明 Query接口 Criteria接口
------------------------------------------------------------------------------------------------
List list() 返回List集合 支持 支持
------------------------------------------------------------------------------------------------
Iterator iterate() 返回Iterator迭代器,只查询出ID值 支持 不支持
------------------------------------------------------------------------------------------------
Object uniqueResult 返回唯一对象 支持 支持
------------------------------------------------------------------------------------------------
eg: Emp emp = session.createCriteria(Emp.class).add(Restrictions.gt("salary",4000D))
.addOrder(Order.asc("salary")).uniqueResult();
四、连接查询
1.Criteria查询和HQL查询都支持连接查询,Criteria只支持内连接和迫切左外连接
2.Criteria接口提供了createCriteria()和createAlias()方法建立内连接
createCriteria(): 输出姓名包括“a”的员工
eg:List<Emp> list = session.createCriteria(Emp.class).add(Restrictions.ilike("empName","a",MatchMode.anywhere))
.createCriteria("dept").list();
createAlias():输出姓名包括“a”的员工
eg:eg:List<Emp> list = session.createCriteria(Emp.class).add(Restrictions.ilike("empName","a",MatchMode.anywhere))
.createAlias("dept").list();
3.Criteria接口提供了setFetchMode()方法来设置迫切左外连接
查询位置在“西一区”的部门及其员工人数
eg:List<Dept> list = session.createCriteria(Dept.class,"d").setFetchMode("emps",FetchMode.Join)
.add(Restrictions.eq("d.location","西一区").ignoreCase()).list();
五、投影分组及DetachedCriteria
1.使用投影和分组
1.1:查询1个的属性 使用Criteria接口的setProjection()方法来设置投影属性
eg:List<String> list = session.createCriteria(Dept.class).setProjection(
Property.forName("deptName")).list();
1.2: 查询2个以上的属性。需要使用Projections的projectionList()方法
eg:List<Object[]> list = session.createCriteria(Emp.class).setProjection(
Propertions.projectionList().add(Property.forName("empName"))
.add(Property.forName("hiredate"))
).list();
1.3:Projections常用聚合查询方法
------------------------------------------------------------------------------
方法 说明
------------------------------------------------------------------------------
PropertyProjection Projections.groupProperty(String propertyName) 分组
------------------------------------------------------------------------------
Projection Projections.rowCount() 统计记录数
------------------------------------------------------------------------------
AggregateProjection Projections.avg(String propertyName) 统计平均值
------------------------------------------------------------------------------
AggregateProjection Projections.max(String propertyName) 统计最大值
------------------------------------------------------------------------------
AggregateProjection Projections.min(String propertyName) 统计最小值
------------------------------------------------------------------------------
CountProjection Projections.count(String propertyName) 统计某一段的非空记录数
------------------------------------------------------------------------------
AggregateProjection Projections.sum(String propertyName) 针对某一字段求和
------------------------------------------------------------------------------
eg:List<Object[]> list = session.createCriteria(Emp.class,"e").createAlias("e.dept","d").
setProjection(
Projections.projectionList()
.add(Projections.groupProperty("d.deptName"))
.add(Projections.avg("e.salary"))
.add(Projections.max("e.salary"))
.add(Projections.min("e.salary"))
).list();
2.使用DetachedCriteria(DetachedCriteria创建时不需要Session对象而Criteria是由Session对象创建的)
2.1:什么时候使用DetachedCriteria查询:在常规的Web编程中,有大量的动态查询
使用DetachedCriteria查询财务部的姓名包括“a”的员工
eg:DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Emp.class,"e")
.createAlias("d.dept","d")
.add(Restrictions.eq("d.deptName","财务部"))
.add(Restrictions.ilike("e.empName","a",
MatchMode.anywhere));
List<Emp> list = detachedCriteria.getExecutableCriteria(session).list();
Hibernate框架Criteria查询的更多相关文章
- Hibernate框架的查询方式
技术分析之Hibernate框架的查询方式 1. 唯一标识OID的检索方式 * session.get(对象.class,OID) 2. 对象的导航的方式 ...
- (补充)10.Hibernate框架的查询方式
技术分析之Hibernate框架的查询方式 1. 唯一标识OID的检索方式 * session.get(对象.class,OID) 2. 对象的导航的方式 3. HQL的检索方式 * Hibernat ...
- hibernate框架之-查询结果集返回类型
Hibernate支持HQL和SQL的查询,返回结果支持POJO类型或字段/数组的形式. 开发中用Hibernate进行数据库查询,用的是SQL.原来需要查询一个表的几乎所有字段,所以我使用了addE ...
- Hibernate框架进阶(下篇)之查询
导读 Hibernate进阶篇分为上中下三篇,本文为最后一篇,主要内容是Hibernate框架的查询,主要包括hql语句查询,criteria查询以及查询策略的选择. 知识框架 Hibernate查询 ...
- 框架之 hibernate之各种查询
1. Hibernate的查询方式 2. Hibernate的查询策略 案例:使用Hibernate完成查询所有联系人功能 需求分析 1. 完成所有的联系人的查询 技术分析之Hibernate框架的查 ...
- Hibernate框架的第四天
## Hibernate框架的第四天 ## ---------- **回顾:Hibernate框架的第三天** 1. 一对多关联关系映射 * JavaBean的编写 * 编写映射的配置文件 * 使用级 ...
- Hibernate框架第二天
### Hibernate的持久化类 ### ---------- **什么是持久化类** 1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为 ...
- Android数据库hibernate框架
说明 /** * YDL_Hibernate总结 <br/> * (一)支持功能: 1.自己主动建表,支持属性来自继承类:可依据注解自己主动完毕建表,而且对于继承类中的注解字段也支持自己主 ...
- hibernate的面向对象查询的效率有多低?
前言 老平台的查询速度很慢,需要进行优化(...说白了就是优化sql语句),老平台用的strus2+hibernate框架,查询基本都是使用的HSQL. 关于hsql HQL是Hibernate Qu ...
随机推荐
- jQuery仿淘宝图片无缝滚动轮播
自己前天,也就是1月8日的时候早上自己写了一个图片滚动轮播(基于jQuery). 其实几个月以前就有朋友问过我怎么做出和淘宝上面一样的滚动轮播,一直到现在也没有真正的写好,这次写得差不多了. 但是还有 ...
- NodeMCU之旅(三):响应配置按钮
引言 在之前的代码中,要连接的WIFI信息都已写死在代码里,这显然不能适应我们的需求.所以需要想个办法让用户可以配置这些信息. WIFI工作模式 NodeMCU支持STATION,SOFTAP,STA ...
- HTTP Session学习
session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的含义也很不相同.这里只探讨HTTP S ...
- android 快捷技巧
快捷方式 <!--[if !supportLists]-->0. Ctrl + 1 (快速修复) <!--[if !supportLists]-->1. Ctrl + D (删 ...
- C# winform ListView+CheckBox的做法
1.设置ListView的属性:CheckBoxs=true 2.ListView字段第一列文本框为空,把工具箱里面的CheckBox控件拖到ListView的第一个字段做全选/全不选的控件. 3.C ...
- JspContext对象与PageContext对象
JspContext对象与PageContext对象: public abstract javax.servlet.jsp.PageContext extends (public abstract) ...
- 基于Flex的HTTPService(GET和POST)
一.基于GET的HTTPService: <?xml version="1.0" encoding="utf-8"?><mx:Applicat ...
- 框架基础:ajax设计方案(三)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组
马上要过年了,哎,回家的心情也特别的激烈.有钱没钱,回家过年,家永远是舔舐伤口最好的地方.新的一年继续加油努力. 上次做了前端的ajax的上传文件技术,支持单文件,多文件上传,并对文件的格式和大小进行 ...
- KB奇遇记(2):缘起
最早听到这家公司的名字,大概还是在好几年前. 正是2012年,之前的在一起灿坤待过的同事LY在这家公司当高层,正好公司规模大了,要上ERP项目.苦于公司没有这方面的人才,而内部IT又太差劲支撑不起来. ...
- 不要怂,就是GAN (生成式对抗网络) (四):训练和测试 GAN
在 /home/your_name/TensorFlow/DCGAN/ 下新建文件 train.py,同时新建文件夹 logs 和文件夹 samples,前者用来保存训练过程中的日志和模型,后者用来保 ...