Criteria查询语句的补充:高级特性

开发 后端
本篇文章讲述Hibernate中Criteria 查询语句的补充。在代码中提供的一对多的例子中,作者使用复合查询,查询所有用户及其地址。

以下代码对Criteria查询做了一些补充。代码内部有注释。

  1. package com.shiryu.otm;  
  2.  
  3. import java.util.Iterator;  
  4. import java.util.List;  
  5.  
  6. import org.hibernate.Criteria;  
  7. import org.hibernate.Session;  
  8. import org.hibernate.SessionFactory;  
  9. import org.hibernate.Transaction;  
  10. import org.hibernate.cfg.Configuration;  
  11. import org.hibernate.criterion.DetachedCriteria;  
  12. import org.hibernate.criterion.Expression;  
  13. import org.hibernate.criterion.Order;  
  14. import org.hibernate.criterion.Projections;  
  15. import org.hibernate.criterion.Subqueries;  
  16.  
  17. public class Test2 {  
  18.     public static void main(String args[]) {  
  19.         SessionFactory factory = new Configuration().configure().buildSessionFactory();  
  20.         Session session = factory.openSession();  
  21.         Transaction tr = session.beginTransaction();  
  22.  
  23.         // Criteria查询语句的补充  
  24.         // 一、复合查询  
  25.         // 在这个一对多的例子中。我们使用复合查询,查询所有用户及其地址。  
  26.         // Criteria criteria = session.createCriteria(User.class);  
  27.         // List list = criteria.list();  
  28.         //  
  29.         // for (int i = 0; i <  list.size(); i++) {  
  30.         // User user = (User) list.get(i);  
  31.         // System.out.println("\t user:"+i+" name is:" + user.getName());  
  32.         //              
  33.         // Set addrSet = user.getAddresses();  
  34.         // Iterator it = addrSet.iterator();  
  35.         // while(it.hasNext()){  
  36.         // Address addr = (Address)it.next();  
  37.         // System.out.println("\t\t user:"+i+" address is:"+addr.getAddress());  
  38.         // }  
  39.         // }  
  40.  
  41.         // 通过Criteria查询条件,我们可以查询位于上海的用户  
  42.         // Criteria criteria = session.createCriteria(User.class);  
  43.         //  
  44.         // Criteria addCriteria =  
  45.         // criteria.createCriteria("addresses");//这里addresses和User类对应  
  46.         // addCriteria.add(Expression.like("address",  
  47.         // "%shanghai%"));//这里构造新的Criteria查询过滤条件  
  48.         // List list = criteria.list();  
  49.         //  
  50.         // for (int i = 0; i <  list.size(); i++) {  
  51.         // User user = (User) list.get(i);  
  52.         // System.out.println("\t user:" + i + " name is:" + user.getName());  
  53.         //  
  54.         // Set addrSet = user.getAddresses();  
  55.         // Iterator it = addrSet.iterator();  
  56.         // while (it.hasNext()) {  
  57.         // Address addr = (Address) it.next();  
  58.         // System.out.println("\t\t user:" + i + " address is:"  
  59.         // + addr.getAddress());  
  60.         // }  
  61.         // }  
  62.  
  63.         /*  
  64.         * 二、DetachedCriteria的使用 hibernate2 中critria  
  65.         * 生命周期位于宿主Session生命周期之内,session创建criteria实例,Session被销毁,critria实例也随之失效  
  66.         * 这很大程度上限制了criteria的重用hibernate3 中提供了DetachedCriteria  
  67.         * 它可以脱离Session实例独立存在,我们可以把通用的criteria查询条件进行抽离,更好的实现代码重用  
  68.         */ 
  69.  
  70.         DetachedCriteria deCriteria = DetachedCriteria.forClass(User.class);  
  71.         deCriteria.add(Expression.eq("name""zhaiyu"));  
  72.         deCriteria.add(Expression.eq("age"new Integer(21)));  
  73.  
  74.         Criteria criteria = deCriteria.getExecutableCriteria(session);// 在其需要的时候与session进行绑定  
  75.         Iterator it = criteria.list().iterator();  
  76.         while (it.hasNext()) {  
  77.             User user = (User) it.next();  
  78.             System.out.println(user.getName());  
  79.         }  
  80.  
  81.         /*  
  82.         * DetachedCriteria 也可以用于子查询表达 下例返回了年龄超过了平均值的用户记录  
  83.         */ 
  84.         DetachedCriteria avgAge = DetachedCriteria.forClass(User.class);  
  85.         avgAge.setProjection(Projections.avg("age"));  
  86.  
  87.         Criteria criteria2 = session.createCriteria(User.class);  
  88.         criteria2.add(Subqueries.propertyGt("age", avgAge));  
  89.  
  90.         List list = criteria2.list();  
  91.         // 我们可以将DetachedCriteria纳入查询表达式 :select ... from User where age > (select  
  92.         // avg(age) from User)  
  93.         // (select avg(age) from User) 由DetachedCriteria avgAge描述  
  94.  
  95.         /* 三、Criteria查询语句的高级特性 */ 
  96.         // 限定返回记录范围  
  97.         Criteria criteria3 = session.createCriteria(User.class);  
  98.         // 限定从第100条开始的20条记录  
  99.         criteria3.setFirstResult(100);  
  100.         criteria3.setMaxResults(20);  
  101.  
  102.         // 对记录进行排序  
  103.         Criteria criteria4 = session.createCriteria(User.class);  
  104.         criteria4.add(Expression.eq("id"new Integer(2)));  
  105.         criteria4.addOrder(Order.asc("name"));  
  106.         criteria4.addOrder(Order.desc("id"));  
  107.  
  108.         /* Criteria分组与统计 */ 
  109.         Criteria criteria5 = session.createCriteria(User.class);  
  110.         criteria5.setProjection(Projections.groupProperty("age"));  
  111.  
  112.         Iterator it3 = criteria5.list().iterator();  
  113.         while (it.hasNext()) {  
  114.             System.out.println(it.next());  
  115.         }  
  116.     }  
  117. }  

【编辑推荐】

  1. Hibernate中使用Criteria查询实例
  2. Hibernate中使用DetchedCriteria
  3. Hibernate之Criteria进阶查询
  4. Hibernate之Criteria基本查询
  5. Hibernate的事务:事务对象的方法
责任编辑:book05 来源: 百度博客
相关推荐

2021-07-05 09:24:06

MySQL SQL 语句数据库

2009-06-17 14:17:40

Criteria条件查Hibernate

2009-06-30 16:44:10

Criteria基本查

2009-06-30 16:46:45

Criteria进阶查

2009-06-30 16:55:19

2010-11-25 14:33:26

MySQL查询分页

2009-11-13 09:24:58

JPA 2.0Criteria AP

2009-06-18 10:07:03

CriteriaHibernate

2009-06-26 16:15:04

Criteria的用法Hibernate

2010-05-27 11:49:37

2009-09-28 12:57:54

Hibernate C

2010-10-21 12:16:11

SQL Server查

2010-11-18 13:32:12

Oracle分页查询

2010-11-24 17:36:02

MySQL条件查询语句

2010-09-26 15:23:24

SQL语句

2009-09-24 13:03:38

Hibernate C

2009-04-09 13:14:09

Oracle分页查询CBO

2010-11-02 08:58:59

Cassandra

2010-09-28 14:33:13

SQL语句

2024-03-01 08:51:01

Django查询表达式查询语句
点赞
收藏

51CTO技术栈公众号