Criteria Query:通過面向?qū)ο蠡脑O(shè)計(jì),將數(shù)據(jù)查詢條件封裝為一個(gè)對(duì)象。Criteria本身只是一個(gè)查詢?nèi)萜鳎唧w的查詢條件需要通過Criteria.add方法添加到Criteria實(shí)例中。Expression對(duì)象具體描述了查詢條件。
示例查詢并不常用,一方面它的使用比較繁瑣,另外從可讀性上來(lái)講也不如Expression來(lái)的直觀。但是在某些情況下卻有其特別的用途。
示例查詢最常用的場(chǎng)景是組合查詢。我們常常需要在界面上提供若干查詢選項(xiàng),然后根據(jù)用戶的選擇返回復(fù)合條件的結(jié)果。實(shí)例查詢?cè)谶@里能發(fā)
揮其特長(zhǎng):
package com.wyq.demo.common.criteriaquery;
import java.util.Iterator;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
/**
* @author 作者
* @version 創(chuàng)建時(shí)間:2008-11-29 上午09:26:48
* 類說(shuō)明
*/
public class TestCriteria {
/**
* @authorwyq
* @功能:
* @param args
*/
public static void main(String[] args) {
Session session = null;
//新建一個(gè)criteria查詢?nèi)萜?/span>
Criteria criteria = session.createCriteria(TUser.class);
/*(1)cireria查詢
* 構(gòu)造查詢條件,Expression對(duì)象具體描述了查詢條件
* 在Hibernate3中,引入了Restrictions類作為Expression的替代
* Expression.eq 等于
* Expression.allEq 參數(shù)為一個(gè)map包好了多個(gè)屬性-值對(duì)應(yīng)關(guān)系
* Expression.gt 大于
* Expression.ge 大于等于
* Expression.lt 小于
* Expression.le 小于等于
* Expression.between 表示某個(gè)字段位于2個(gè)數(shù)之間
* Expression.like 模糊查詢
* Expression.in 范圍查詢
* Expression.eqProperty 用于比較2個(gè)屬性之間的值"field=field"
* Expression.gtProperty 屬性1>屬性2
* Expression.geProperty 屬性1>=屬性2
* Expression.ltProperty 屬性1<屬性2
* Expression.leProperty 屬性1<=屬性2
* Expression.and and關(guān)系組合
* Expression.or or關(guān)系組合
* Expression.sql 通過這個(gè)方法直接通過SQL語(yǔ)句限定查詢條件
*/
criteria.add(Expression.eq("name","Erica"));
criteria.add(Expression.eq("sex",new Integer(1)));
/*(2)示例查詢
* Example類實(shí)現(xiàn)了Criterion接口,同樣,它也可以用作Criteria的查詢條件。Example
* 的作用是:根據(jù)已有對(duì)象,查找屬性與之相符的其他對(duì)象
* 示例查詢最常用的場(chǎng)景是組合查詢。我們常常需要在界面上提供若干查詢選項(xiàng),然后
* 根據(jù)用戶的選擇返回符合條件的結(jié)果。
* Example example = Example.create(cat)
* excludeZeroes() //exclude zero valued properties
* excludeProperty("color") //exclude the property named "color"
* ignoreCase() //perform case insensitive string comparisons
* enableLike(); //use like for string comparisons
* List results = session.createCriteria(Cat.class)
* add(example)
* list();
*/
TUser exampleUser = new TUser();
exampleUser.setName("Erica");
criteria.add(Example.create(exampleUser));
/*
* (3)復(fù)合查詢
* 在原有查詢的基礎(chǔ)上,針對(duì)TUser對(duì)象的addresses屬性構(gòu)造了新的查詢過濾條件
*/
Criteria addCriteria = criteria.createCriteria("addresses");
addCriteria.add(Expression.like("address", "%Shanghai%"));
/*
* (4)DetachedCriteria
* 使Criteria脫離session實(shí)例獨(dú)立存在,這樣,我們就可以將某些通用的Criteria
* 查詢條件進(jìn)行抽離,每次使用時(shí)再與當(dāng)前Session實(shí)例綁定以獲得更好的代碼重用效果
*/
DetachedCriteria deCriteria = DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression.eq("name", "Erica"));
deCriteria.add(Expression.eq("sex",new Integer(1)));
Criteria creiterias = deCriteria.getExecutableCriteria(session);
Iterator it = criteria.list().iterator();
/*
* (5)高級(jí)特性
* 通過criteria.setFirstResult/setMaxResults方法可以限制一次查詢返回的記錄范圍:
*/
creiterias.setFirstResult(100);
creiterias.setMaxResults(20);
/*
* 排序
*/
creiterias.addOrder(Order.asc("name"));
/*
* 分組與統(tǒng)計(jì)
* 分組、統(tǒng)計(jì)表達(dá)式由Hibernate3新引入的Projections Class進(jìn)行封裝
* 按照age分組查詢
* Projections.groupProperty()方法實(shí)際上是對(duì)SQL group by子句的封裝。同
* 樣,我們可以通過Projections.avg(),rowCount(),count(),max(),min(),countDistinct()
* 等方法實(shí)現(xiàn)查詢統(tǒng)計(jì)功能
*/
creiterias.setProjection(Projections.groupProperty("age"));
}
}
import java.util.Iterator;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
/**
* @author 作者
* @version 創(chuàng)建時(shí)間:2008-11-29 上午09:26:48
* 類說(shuō)明
*/
public class TestCriteria {
/**
* @authorwyq
* @功能:
* @param args
*/
public static void main(String[] args) {
Session session = null;
//新建一個(gè)criteria查詢?nèi)萜?/span>
Criteria criteria = session.createCriteria(TUser.class);
/*(1)cireria查詢
* 構(gòu)造查詢條件,Expression對(duì)象具體描述了查詢條件
* 在Hibernate3中,引入了Restrictions類作為Expression的替代
* Expression.eq 等于
* Expression.allEq 參數(shù)為一個(gè)map包好了多個(gè)屬性-值對(duì)應(yīng)關(guān)系
* Expression.gt 大于
* Expression.ge 大于等于
* Expression.lt 小于
* Expression.le 小于等于
* Expression.between 表示某個(gè)字段位于2個(gè)數(shù)之間
* Expression.like 模糊查詢
* Expression.in 范圍查詢
* Expression.eqProperty 用于比較2個(gè)屬性之間的值"field=field"
* Expression.gtProperty 屬性1>屬性2
* Expression.geProperty 屬性1>=屬性2
* Expression.ltProperty 屬性1<屬性2
* Expression.leProperty 屬性1<=屬性2
* Expression.and and關(guān)系組合
* Expression.or or關(guān)系組合
* Expression.sql 通過這個(gè)方法直接通過SQL語(yǔ)句限定查詢條件
*/
criteria.add(Expression.eq("name","Erica"));
criteria.add(Expression.eq("sex",new Integer(1)));
/*(2)示例查詢
* Example類實(shí)現(xiàn)了Criterion接口,同樣,它也可以用作Criteria的查詢條件。Example
* 的作用是:根據(jù)已有對(duì)象,查找屬性與之相符的其他對(duì)象
* 示例查詢最常用的場(chǎng)景是組合查詢。我們常常需要在界面上提供若干查詢選項(xiàng),然后
* 根據(jù)用戶的選擇返回符合條件的結(jié)果。
* Example example = Example.create(cat)
* excludeZeroes() //exclude zero valued properties
* excludeProperty("color") //exclude the property named "color"
* ignoreCase() //perform case insensitive string comparisons
* enableLike(); //use like for string comparisons
* List results = session.createCriteria(Cat.class)
* add(example)
* list();
*/
TUser exampleUser = new TUser();
exampleUser.setName("Erica");
criteria.add(Example.create(exampleUser));
/*
* (3)復(fù)合查詢
* 在原有查詢的基礎(chǔ)上,針對(duì)TUser對(duì)象的addresses屬性構(gòu)造了新的查詢過濾條件
*/
Criteria addCriteria = criteria.createCriteria("addresses");
addCriteria.add(Expression.like("address", "%Shanghai%"));
/*
* (4)DetachedCriteria
* 使Criteria脫離session實(shí)例獨(dú)立存在,這樣,我們就可以將某些通用的Criteria
* 查詢條件進(jìn)行抽離,每次使用時(shí)再與當(dāng)前Session實(shí)例綁定以獲得更好的代碼重用效果
*/
DetachedCriteria deCriteria = DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression.eq("name", "Erica"));
deCriteria.add(Expression.eq("sex",new Integer(1)));
Criteria creiterias = deCriteria.getExecutableCriteria(session);
Iterator it = criteria.list().iterator();
/*
* (5)高級(jí)特性
* 通過criteria.setFirstResult/setMaxResults方法可以限制一次查詢返回的記錄范圍:
*/
creiterias.setFirstResult(100);
creiterias.setMaxResults(20);
/*
* 排序
*/
creiterias.addOrder(Order.asc("name"));
/*
* 分組與統(tǒng)計(jì)
* 分組、統(tǒng)計(jì)表達(dá)式由Hibernate3新引入的Projections Class進(jìn)行封裝
* 按照age分組查詢
* Projections.groupProperty()方法實(shí)際上是對(duì)SQL group by子句的封裝。同
* 樣,我們可以通過Projections.avg(),rowCount(),count(),max(),min(),countDistinct()
* 等方法實(shí)現(xiàn)查詢統(tǒng)計(jì)功能
*/
creiterias.setProjection(Projections.groupProperty("age"));
}
}