项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来

如何使用

查所有

  1.   /**
  2. * 作用:查所有
  3. * 说明:通过list(),返回的是实体对象集合
  4. */
  5. @Test
  6. public void test1(){
  7. //创建连接
  8. Session session = HibernateUtil.getCurrentSession();
  9. //开启事务
  10. Transaction tx = session.beginTransaction();
  11. //创建criteria
  12. Criteria criteria = session.createCriteria(User.class, "u");
  13. //业务
  14. List<User> list = criteria.list();
  15. for (User user : list) {
  16. System.out.println(user);
  17. }
  18. //关闭事务
  19. session.close();
  20. }

条件查询

  1)一个条件

  1. /**
  2. * 作用:or()用法
  3. * 说明:通过or()返回的是实体对象集合
  4. * add(Criterion criterion)用来添加查询条件
  5. * Restrictions通过内置的静态方法,可以创建criterion
  6. */
  7. //创建criteria
  8. Criteria criteria = session.createCriteria(User.class, "u");
  9. //业务:查询出id为1或为2的用户
  10. List<User> list = criteria.add(Restrictions.or(Restrictions.eq("id", 1),
  11. Restrictions.eq("id", 2) ))
  12. .list();

  2)多个条件

  1.   /**
  2. * 作用:多个条件:like()和gt()的用法
  3. */
  4. //创建criteria
  5. Criteria criteria = session.createCriteria(User.class, "u");
  6. //业务:查询出id大于1,名字中带ji的用户
  7. List<User> list = criteria.add(Restrictions.like("name","%ji%"))
  8. .add(Restrictions.gt("id", 1))
  9. .list();

其他的条件就不一一测试了,下面列出常用的Restrictions方法

  1.   Restrictions.eq 等于
  2.   Restrictions.allEq 使用Map,使用key/value进行多个等于的比对
  3.   Restrictions.gt 大于 >
  4.   Restrictions.ge 大于等于 >=
  5.   Restrictions.lt 小于 <
  6.   Restrictions.le 小于等于 <=
  7.   Restrictions.between 对应SQLBETWEEN子句
  8.   Restrictions.like 对应SQLLIKE子句
  9.   Restrictions.in 对应SQLin子句
  10.   Restrictions.and and关系
  11.   Restrictions.or or关系

排序

  1.   /**
  2. * 作用:排序
  3. * 说明:通过addOrder()添加排序条件
  4. * Order设置排序规则,desc是降序,asc是升序
  5. */
  6. //创建criteria
  7. Criteria criteria = session.createCriteria(User.class, "u");
  8. //业务:对查询结果,根据id排序
  9. List<User> list = criteria.addOrder(Order.desc("id"))
  10. .list();

关联

参考 : http://blog.csdn.net/bestlxm/article/details/6735464   

User实体类中有关系属性orders,

数据库中的数据如下:order表中的外键是user_id

  user表:

order表:

代码如下:

  1. /**
  2. * 作用:关联
  3. * 说明:通过createAlias()设置关系属性
  4. * 对已定义关联关系的,我们可以使用createAlias()来创建属性的别名,然后引用别名进行条件查询,如:
  5. 这样进行查询时就可得到关联查询后的Parent对象结果集,本例中,User是Parent类
  6. *
  7. * Hibernate打印sql语句如下:
  8. * select
  9. this_.id as id0_1_,
  10. this_.age as age0_1_,
  11. this_.birth as birth0_1_,
  12. this_.name as name0_1_,
  13. o1_.id as id1_0_,
  14. o1_.note as note1_0_,
  15. o1_.price as price1_0_
  16. from
  17. user50 this_
  18. inner join
  19. order50 o1_
  20. on this_.id=o1_.user_id
  21. where
  22. o1_.id = ?
  23.  
  24. * 控制台打印如下:
  25. * User [userID=1, name=zhangjifeng, age=18, birthday=2016-07-26]
  26. */
  27. @Test
  28. public void test5(){
  29. //创建连接
  30. Session session = HibernateUtil.getCurrentSession();
  31. //开启事务
  32. Transaction tx = session.beginTransaction();
  33. //创建criteria
  34. Criteria criteria = session.createCriteria(User.class, "u");
  35. //业务:
  36. List<User> list = criteria.createAlias("orders","o")
  37. .add(Restrictions.eq("o.id", 1))
  38. .list();
  39. for (User user : list) {
  40. System.out.println(user);
  41. }
  42.  
  43. //关闭事务
  44. session.close();
  45. }

关联2:createCriteria()

测试代码如下

  1.   /**
  2. * 第二个createCriteria(),返回的是一个新的实例
  3. * 打印出user和order
  4. */
  5. @Test
  6. public void test6(){
  7. //创建连接
  8. Session session = HibernateUtil.getCurrentSession();
  9. //开启事务
  10. Transaction tx = session.beginTransaction();
  11. //创建criteria
  12. Criteria criteria = session.createCriteria(User.class, "u");
  13. //业务:
  14. List list = criteria.createCriteria("orders","o")
  15. .add(Restrictions.eq("o.id", 1))
  16. .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
  17. .list();
  18. Iterator iterator = list.iterator();
  19. while (iterator.hasNext()) {
  20. Map map = (Map)iterator.next();
  21.  
  22. // Set keySet = map.keySet();
  23.  
  24. Set entrySet = map.entrySet();
  25. Iterator iterator2 = entrySet.iterator();
  26. while(iterator2.hasNext()){
  27. Map.Entry<String, Object> map1 =(Entry<String, Object>) iterator2.next();
  28. System.out.println(map1.getValue());
  29. }
  30. }
  31. //关闭事务
  32. session.close();
  33. }

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):计算属性值的总和。

代码如下:

  1. /**
  2. * 投影:Projections
  3. * 统计,重复
  4. */
  5. @Test
  6. public void test8(){
  7. //创建连接
  8. Session session = HibernateUtil.getCurrentSession();
  9. //开启事务
  10. Transaction tx = session.beginTransaction();
  11. //创建criteria
  12. Criteria criteria = session.createCriteria(Order.class, "o");
  13. //业务:
  14. List<Object[]> list = criteria.setProjection(Projections.projectionList()
  15. .add(Projections.max("price"))
  16. .add(Projections.min("price"))
  17. .add(Projections.avg("price"))
  18. .add(Projections.countDistinct("note")) )
  19. .list();
  20. for (Object[] objects : list) {
  21. for (Object object : objects) {
  22. System.out.println(object);
  23. }
  24. }
  25. //关闭事务
  26. session.close();

获得的结果是单独的属性而不是实体类。例如,一个产品表中包含有很多字段,我们想要获取产品表中的名称和描述,而不需要将完整的实体加载到内存中

  1.   /**
  2. * 投影:Projections
  3. * 获取部分字段
  4. */
  5. @Test
  6. public void test9(){
  7. //创建连接
  8. Session session = HibernateUtil.getCurrentSession();
  9. //开启事务
  10. Transaction tx = session.beginTransaction();
  11. //创建criteria
  12. Criteria criteria = session.createCriteria(Order.class, "o");
  13. //业务:
  14. ProjectionList projList = Projections.projectionList();
  15. projList.add(Projections.property("name"));
  16. projList.add(Projections.property("price"));
  17. criteria.setProjection(projList);
  18. List result = criteria.list();
  19. for (Object object : result) {
  20. System.out.println(object);
  21. }
  22. //关闭事务
  23. session.close();
  24. }

hibernate的Criteria条件查询的更多相关文章

  1. Hibernate中的条件查询完成类

    Hibernate中的条件查询有以下三个类完成: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类

  2. 分享知识-快乐自己:Hibernate 中Criteria Query查询详解

    1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...

  3. Hibernate中的条件查询完毕类

    Hibernate中的条件查询有下面三个类完毕: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类

  4. Hibernate 中Criteria Query查询详解【转】

    当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中.此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询 ...

  5. Nhibernate Query By Criteria 条件查询

    HQL运算符 QBC运算符 含义 = Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrictio ...

  6. Hibernate 日期映射 条件查询

    1. hql: ...and accopt_time > ?" 2. query.setDate Query query = session.createQuery(hql); int ...

  7. Hibernate QBC 条件查询(Criteria Queries) and Demos

    目录 创建一个Criteria 实例 限制结果集内容 结果集排序 关联 动态关联抓取 查询示例 投影Projections聚合aggregation和分组grouping 离线detached查询和子 ...

  8. hibernate Criteria(条件查询接口)

    Criteria(条件查询接口) // 1.简单查询 List<Customer> list = session.createCriteria(Customer.class).list() ...

  9. Hibernate条件查询

    设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装.现在对 Hibernate的Criteria 的用法进行总结:Hibernate 设计了 CriteriaSpecificat ...

随机推荐

  1. CF 371C-Hamburgers[二分答案]

    C. Hamburgers time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  2. 查找代码错误.java

    class Other{ public int i; } class Something{ public static oivd main(String[]args){ Other o = new O ...

  3. Editor扩展之查看Prefab用在那儿

    Prefab查找需求 在项目开发阶段的中后期,工程中有越来越多的Prefab,当我们要修改一个prefab或删除无用的prefab时,或许我们不是那么清楚该prefab在那些场景中使用着或从未使用过, ...

  4. flex sdk中mx_internal function getTextField() 这种函数如何调用?

    在用flex 开发中,一些函数前打上了 mx_internal 外部调用不了,其实这样写就可以了 xxx.mx_internal::getTextField() 而 xxx.getTextField( ...

  5. SQL部分 数据库的建立 增删改查

    数据库: 结构化查询语言(Structured Query Language)简称SQL: 数据库管理系统(Database Management System)简称DBMS: 数据库管理员(Data ...

  6. 菜鸟的IT生活4

    今天主要复习了以前的内容,输入输出,数据类型,运算符,顺序语句,分支语句等等,把几个不太连贯跟没上传过的传一下,以后加深下印象,加油!

  7. HTML 学习笔记 CSS(轮廓)

    轮廓(outline)是绘制于元素周围的一条线 位于边框边缘的外围 可起到突出元素的作用 CSS outline属性规定元素轮廓的样式 颜色和宽度 话不多说 来几个例子 看一看 1:在元素周围画线 & ...

  8. C#实现php的hash_hmac函数

    from:http://blog.csdn.net/ciaos/article/details/12618487 PHP代码示例如下 <?php         $res1 = hash_hma ...

  9. PAT 1026. 程序运行时间(15)

    要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock tick,即&q ...

  10. windows和ubuntu下gif动态图片的制作

    现在社交软件中, 各种各样的动图为大家交流很大的乐趣.  Gif图片比视频小, 比静态JPG图片形象生动, 更适用于产品展示和步骤演示等. 这里简单介绍一下在window系统和ubuntu系统下gif ...