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 ...
随机推荐
- CF 371C-Hamburgers[二分答案]
C. Hamburgers time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 查找代码错误.java
class Other{ public int i; } class Something{ public static oivd main(String[]args){ Other o = new O ...
- Editor扩展之查看Prefab用在那儿
Prefab查找需求 在项目开发阶段的中后期,工程中有越来越多的Prefab,当我们要修改一个prefab或删除无用的prefab时,或许我们不是那么清楚该prefab在那些场景中使用着或从未使用过, ...
- flex sdk中mx_internal function getTextField() 这种函数如何调用?
在用flex 开发中,一些函数前打上了 mx_internal 外部调用不了,其实这样写就可以了 xxx.mx_internal::getTextField() 而 xxx.getTextField( ...
- SQL部分 数据库的建立 增删改查
数据库: 结构化查询语言(Structured Query Language)简称SQL: 数据库管理系统(Database Management System)简称DBMS: 数据库管理员(Data ...
- 菜鸟的IT生活4
今天主要复习了以前的内容,输入输出,数据类型,运算符,顺序语句,分支语句等等,把几个不太连贯跟没上传过的传一下,以后加深下印象,加油!
- HTML 学习笔记 CSS(轮廓)
轮廓(outline)是绘制于元素周围的一条线 位于边框边缘的外围 可起到突出元素的作用 CSS outline属性规定元素轮廓的样式 颜色和宽度 话不多说 来几个例子 看一看 1:在元素周围画线 & ...
- C#实现php的hash_hmac函数
from:http://blog.csdn.net/ciaos/article/details/12618487 PHP代码示例如下 <?php $res1 = hash_hma ...
- PAT 1026. 程序运行时间(15)
要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock tick,即&q ...
- windows和ubuntu下gif动态图片的制作
现在社交软件中, 各种各样的动图为大家交流很大的乐趣. Gif图片比视频小, 比静态JPG图片形象生动, 更适用于产品展示和步骤演示等. 这里简单介绍一下在window系统和ubuntu系统下gif ...