Criteria查詢語句的補充:高級特性
作者:佚名
本篇文章講述Hibernate中Criteria 查詢語句的補充。在代碼中提供的一對多的例子中,作者使用復合查詢,查詢所有用戶及其地址。
以下代碼對Criteria查詢做了一些補充。代碼內部有注釋。
- package com.shiryu.otm;
- import java.util.Iterator;
- import java.util.List;
- import org.hibernate.Criteria;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.criterion.DetachedCriteria;
- import org.hibernate.criterion.Expression;
- import org.hibernate.criterion.Order;
- import org.hibernate.criterion.Projections;
- import org.hibernate.criterion.Subqueries;
- public class Test2 {
- public static void main(String args[]) {
- SessionFactory factory = new Configuration().configure().buildSessionFactory();
- Session session = factory.openSession();
- Transaction tr = session.beginTransaction();
- // Criteria查詢語句的補充
- // 一、復合查詢
- // 在這個一對多的例子中。我們使用復合查詢,查詢所有用戶及其地址。
- // Criteria criteria = session.createCriteria(User.class);
- // List list = criteria.list();
- //
- // for (int i = 0; i < list.size(); i++) {
- // User user = (User) list.get(i);
- // System.out.println("\t user:"+i+" name is:" + user.getName());
- //
- // Set addrSet = user.getAddresses();
- // Iterator it = addrSet.iterator();
- // while(it.hasNext()){
- // Address addr = (Address)it.next();
- // System.out.println("\t\t user:"+i+" address is:"+addr.getAddress());
- // }
- // }
- // 通過Criteria查詢條件,我們可以查詢位于上海的用戶
- // Criteria criteria = session.createCriteria(User.class);
- //
- // Criteria addCriteria =
- // criteria.createCriteria("addresses");//這里addresses和User類對應
- // addCriteria.add(Expression.like("address",
- // "%shanghai%"));//這里構造新的Criteria查詢過濾條件
- // List list = criteria.list();
- //
- // for (int i = 0; i < list.size(); i++) {
- // User user = (User) list.get(i);
- // System.out.println("\t user:" + i + " name is:" + user.getName());
- //
- // Set addrSet = user.getAddresses();
- // Iterator it = addrSet.iterator();
- // while (it.hasNext()) {
- // Address addr = (Address) it.next();
- // System.out.println("\t\t user:" + i + " address is:"
- // + addr.getAddress());
- // }
- // }
- /*
- * 二、DetachedCriteria的使用 hibernate2 中critria
- * 生命周期位于宿主Session生命周期之內,session創建criteria實例,Session被銷毀,critria實例也隨之失效
- * 這很大程度上限制了criteria的重用hibernate3 中提供了DetachedCriteria
- * 它可以脫離Session實例獨立存在,我們可以把通用的criteria查詢條件進行抽離,更好的實現代碼重用
- */
- DetachedCriteria deCriteria = DetachedCriteria.forClass(User.class);
- deCriteria.add(Expression.eq("name", "zhaiyu"));
- deCriteria.add(Expression.eq("age", new Integer(21)));
- Criteria criteria = deCriteria.getExecutableCriteria(session);// 在其需要的時候與session進行綁定
- Iterator it = criteria.list().iterator();
- while (it.hasNext()) {
- User user = (User) it.next();
- System.out.println(user.getName());
- }
- /*
- * DetachedCriteria 也可以用于子查詢表達 下例返回了年齡超過了平均值的用戶記錄
- */
- DetachedCriteria avgAge = DetachedCriteria.forClass(User.class);
- avgAge.setProjection(Projections.avg("age"));
- Criteria criteria2 = session.createCriteria(User.class);
- criteria2.add(Subqueries.propertyGt("age", avgAge));
- List list = criteria2.list();
- // 我們可以將DetachedCriteria納入查詢表達式 :select ... from User where age > (select
- // avg(age) from User)
- // (select avg(age) from User) 由DetachedCriteria avgAge描述
- /* 三、Criteria查詢語句的高級特性 */
- // 限定返回記錄范圍
- Criteria criteria3 = session.createCriteria(User.class);
- // 限定從第100條開始的20條記錄
- criteria3.setFirstResult(100);
- criteria3.setMaxResults(20);
- // 對記錄進行排序
- Criteria criteria4 = session.createCriteria(User.class);
- criteria4.add(Expression.eq("id", new Integer(2)));
- criteria4.addOrder(Order.asc("name"));
- criteria4.addOrder(Order.desc("id"));
- /* Criteria分組與統計 */
- Criteria criteria5 = session.createCriteria(User.class);
- criteria5.setProjection(Projections.groupProperty("age"));
- Iterator it3 = criteria5.list().iterator();
- while (it.hasNext()) {
- System.out.println(it.next());
- }
- }
- }
【編輯推薦】
責任編輯:book05
來源:
百度博客