hibernate的Criteria条件查询
项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来
如何使用
查所有
/**
* 作用:查所有
* 说明:通过list(),返回的是实体对象集合
*/
@Test
public void test1(){
//创建连接
Session session = HibernateUtil.getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
//创建criteria
Criteria criteria = session.createCriteria(User.class, "u");
//业务
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
//关闭事务
session.close();
}
条件查询
1)一个条件
/**
* 作用:or()用法
* 说明:通过or()返回的是实体对象集合
* add(Criterion criterion)用来添加查询条件
* Restrictions通过内置的静态方法,可以创建criterion
*/
//创建criteria
Criteria criteria = session.createCriteria(User.class, "u");
//业务:查询出id为1或为2的用户
List<User> list = criteria.add(Restrictions.or(Restrictions.eq("id", 1),
Restrictions.eq("id", 2) ))
.list();
2)多个条件
/**
* 作用:多个条件:like()和gt()的用法
*/
//创建criteria
Criteria criteria = session.createCriteria(User.class, "u");
//业务:查询出id大于1,名字中带ji的用户
List<User> list = criteria.add(Restrictions.like("name","%ji%"))
.add(Restrictions.gt("id", 1))
.list();
其他的条件就不一一测试了,下面列出常用的Restrictions方法
Restrictions.eq 等于
Restrictions.allEq 使用Map,使用key/value进行多个等于的比对
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关系
排序
/**
* 作用:排序
* 说明:通过addOrder()添加排序条件
* Order设置排序规则,desc是降序,asc是升序
*/
//创建criteria
Criteria criteria = session.createCriteria(User.class, "u");
//业务:对查询结果,根据id排序
List<User> list = criteria.addOrder(Order.desc("id"))
.list();
关联
参考 : http://blog.csdn.net/bestlxm/article/details/6735464
User实体类中有关系属性orders,
数据库中的数据如下:order表中的外键是user_id
user表:

order表:

代码如下:
/**
* 作用:关联
* 说明:通过createAlias()设置关系属性
* 对已定义关联关系的,我们可以使用createAlias()来创建属性的别名,然后引用别名进行条件查询,如:
这样进行查询时就可得到关联查询后的Parent对象结果集,本例中,User是Parent类
*
* Hibernate打印sql语句如下:
* select
this_.id as id0_1_,
this_.age as age0_1_,
this_.birth as birth0_1_,
this_.name as name0_1_,
o1_.id as id1_0_,
o1_.note as note1_0_,
o1_.price as price1_0_
from
user50 this_
inner join
order50 o1_
on this_.id=o1_.user_id
where
o1_.id = ? * 控制台打印如下:
* User [userID=1, name=zhangjifeng, age=18, birthday=2016-07-26]
*/
@Test
public void test5(){
//创建连接
Session session = HibernateUtil.getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
//创建criteria
Criteria criteria = session.createCriteria(User.class, "u");
//业务:
List<User> list = criteria.createAlias("orders","o")
.add(Restrictions.eq("o.id", 1))
.list();
for (User user : list) {
System.out.println(user);
} //关闭事务
session.close();
}
关联2:createCriteria()
测试代码如下
/**
* 第二个createCriteria(),返回的是一个新的实例
* 打印出user和order
*/
@Test
public void test6(){
//创建连接
Session session = HibernateUtil.getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
//创建criteria
Criteria criteria = session.createCriteria(User.class, "u");
//业务:
List list = criteria.createCriteria("orders","o")
.add(Restrictions.eq("o.id", 1))
.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
.list();
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Map map = (Map)iterator.next(); // Set keySet = map.keySet(); Set entrySet = map.entrySet();
Iterator iterator2 = entrySet.iterator();
while(iterator2.hasNext()){
Map.Entry<String, Object> map1 =(Entry<String, Object>) iterator2.next();
System.out.println(map1.getValue());
}
}
//关闭事务
session.close();
}
Projections投影
1)将结果集中的结果当做行和列集来使用,这与通过JDBC执行select查询获得的数据的使用方式相似。因此,Hibernate也支持属性、统计函数和Group By等查询。
2)要想使用Hibernate的投影统计功能,首先要从org.hibernate.criterion.Projections工厂类获得org.hibernate.criterion.Projection对象
3)Hibernate的Projections工厂类包含了以下几个常用的统计函数:
① avg(String propertyName):计算属性字段的平均值。
② count(String propertyName):统计一个属性在结果中出现的次数。
③ countDistinct(String propertyName):统计属性包含的不重复值的数量。
④ max(String propertyName):计算属性值的最大值。
⑤ min(String propertyName):计算属性值的最小值。
⑥ sum(String propertyName):计算属性值的总和。
代码如下:
/**
* 投影:Projections
* 统计,重复
*/
@Test
public void test8(){
//创建连接
Session session = HibernateUtil.getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
//创建criteria
Criteria criteria = session.createCriteria(Order.class, "o");
//业务:
List<Object[]> list = criteria.setProjection(Projections.projectionList()
.add(Projections.max("price"))
.add(Projections.min("price"))
.add(Projections.avg("price"))
.add(Projections.countDistinct("note")) )
.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.println(object);
}
}
//关闭事务
session.close();
获得的结果是单独的属性而不是实体类。例如,一个产品表中包含有很多字段,我们想要获取产品表中的名称和描述,而不需要将完整的实体加载到内存中
/**
* 投影:Projections
* 获取部分字段
*/
@Test
public void test9(){
//创建连接
Session session = HibernateUtil.getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
//创建criteria
Criteria criteria = session.createCriteria(Order.class, "o");
//业务:
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("name"));
projList.add(Projections.property("price"));
criteria.setProjection(projList);
List result = criteria.list();
for (Object object : result) {
System.out.println(object);
}
//关闭事务
session.close();
}
hibernate的Criteria条件查询的更多相关文章
- Hibernate中的条件查询完成类
Hibernate中的条件查询有以下三个类完成: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类
- 分享知识-快乐自己:Hibernate 中Criteria Query查询详解
1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...
- Hibernate中的条件查询完毕类
Hibernate中的条件查询有下面三个类完毕: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类
- Hibernate 中Criteria Query查询详解【转】
当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中.此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询 ...
- Nhibernate Query By Criteria 条件查询
HQL运算符 QBC运算符 含义 = Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrictio ...
- Hibernate 日期映射 条件查询
1. hql: ...and accopt_time > ?" 2. query.setDate Query query = session.createQuery(hql); int ...
- Hibernate QBC 条件查询(Criteria Queries) and Demos
目录 创建一个Criteria 实例 限制结果集内容 结果集排序 关联 动态关联抓取 查询示例 投影Projections聚合aggregation和分组grouping 离线detached查询和子 ...
- hibernate Criteria(条件查询接口)
Criteria(条件查询接口) // 1.简单查询 List<Customer> list = session.createCriteria(Customer.class).list() ...
- Hibernate条件查询
设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 Hibernate的Criteria 的用法进行总结:Hibernate 设计了 CriteriaSpecificat ...
随机推荐
- Linux 下从头再走 GTK+-3.0 (三)
之前我们为窗口添加了一个按钮,接下来让这个按钮丰富一点.并给窗口加上图标. 首先创建 example3,c 的源文件. #include <gtk/gtk.h> static void a ...
- [Notes] Learn Python2.7 From Python Tutorial
I have planed to learn Python for many times. I have started to learn Python for many times . Howeve ...
- 探索 OpenStack 之(16):计量模块 Ceilometer 介绍及优化
0. 背景 0.1 为什么要有 Ceilometer? 通常云,特别是公有云在计费方面有三个层次: 计量 (Metering): 收集资源的使用数据,其数据信息主要包括:使用对象(what), 使用者 ...
- ATM模拟程序
一个很简单的ATM模拟程序 #include <stdio.h> void chaxun(int a3){ int b; b=a3; printf("您的余额为:%d\n&quo ...
- JavaScript作用域闭包简述
JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...
- 全息眼镜HoloLens可快速捕捉真人3D图像
http://www.d9soft.com/zixun/62287.html 北京时间3月28日午间消息,微软研发部门开发出一种新的3D视频捕捉系统“Holoportation”,可以实现将某人3D图 ...
- SpringMVC讲解
2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...
- java 22 - 18 多线程之 线程的状态转换、线程组
线程的状态转换图解:图片 线程的线程组: 线程组: 把多个线程组合到一起. 它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 首先创建一个Runnable的实现类 publi ...
- excel技巧
1. 使文字自动适配方格大小. 自动调整行高(但是合并后的方格不行)
- nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
问题说明:测试机上部署了一套业务环境,nginx反向代理tomcat,在访问时长时间处于加载中,十分缓慢! 通过浏览器调试(F12键->Console),发现有错误ERR_CONTENT_LEN ...