Criteria查詢(xún)語(yǔ)句的補(bǔ)充:高級(jí)特性
作者:佚名
本篇文章講述Hibernate中Criteria 查詢(xún)語(yǔ)句的補(bǔ)充。在代碼中提供的一對(duì)多的例子中,作者使用復(fù)合查詢(xún),查詢(xún)所有用戶及其地址。
以下代碼對(duì)Criteria查詢(xún)做了一些補(bǔ)充。代碼內(nèi)部有注釋。
- 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查詢(xún)語(yǔ)句的補(bǔ)充
- // 一、復(fù)合查詢(xún)
- // 在這個(gè)一對(duì)多的例子中。我們使用復(fù)合查詢(xún),查詢(xún)所有用戶及其地址。
- // 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());
- // }
- // }
- // 通過(guò)Criteria查詢(xún)條件,我們可以查詢(xún)位于上海的用戶
- // Criteria criteria = session.createCriteria(User.class);
- //
- // Criteria addCriteria =
- // criteria.createCriteria("addresses");//這里addresses和User類(lèi)對(duì)應(yīng)
- // addCriteria.add(Expression.like("address",
- // "%shanghai%"));//這里構(gòu)造新的Criteria查詢(xún)過(guò)濾條件
- // 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生命周期之內(nèi),session創(chuàng)建criteria實(shí)例,Session被銷(xiāo)毀,critria實(shí)例也隨之失效
- * 這很大程度上限制了criteria的重用hibernate3 中提供了DetachedCriteria
- * 它可以脫離Session實(shí)例獨(dú)立存在,我們可以把通用的criteria查詢(xún)條件進(jìn)行抽離,更好的實(shí)現(xiàn)代碼重用
- */
- 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);// 在其需要的時(shí)候與session進(jìn)行綁定
- Iterator it = criteria.list().iterator();
- while (it.hasNext()) {
- User user = (User) it.next();
- System.out.println(user.getName());
- }
- /*
- * DetachedCriteria 也可以用于子查詢(xún)表達(dá) 下例返回了年齡超過(guò)了平均值的用戶記錄
- */
- 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納入查詢(xún)表達(dá)式 :select ... from User where age > (select
- // avg(age) from User)
- // (select avg(age) from User) 由DetachedCriteria avgAge描述
- /* 三、Criteria查詢(xún)語(yǔ)句的高級(jí)特性 */
- // 限定返回記錄范圍
- Criteria criteria3 = session.createCriteria(User.class);
- // 限定從第100條開(kāi)始的20條記錄
- criteria3.setFirstResult(100);
- criteria3.setMaxResults(20);
- // 對(duì)記錄進(jìn)行排序
- 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分組與統(tǒng)計(jì) */
- Criteria criteria5 = session.createCriteria(User.class);
- criteria5.setProjection(Projections.groupProperty("age"));
- Iterator it3 = criteria5.list().iterator();
- while (it.hasNext()) {
- System.out.println(it.next());
- }
- }
- }
【編輯推薦】
責(zé)任編輯:book05
來(lái)源:
百度博客