Hibernate數據檢索:
Criteria Query:通過面向對象化的設計,將數據查詢條件封裝為一個對象。Criteria本身只是一個查詢容器,具體的查詢條件需要通過Criteria.add方法添加到Criteria實例中。Expression對象具體描述了查詢條件。
示例查詢并不常用,一方面它的使用比較繁瑣,另外從可讀性上來講也不如Expression來的直觀。但是在某些情況下卻有其特別的用途。
示例查詢最常用的場景是組合查詢。我們常常需要在界面上提供若干查詢選項,然后根據用戶的選擇返回復合條件的結果。實例查詢在這里能發
揮其特長:
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 創建時間:2008-11-29 上午09:26:48
* 類說明
*/
public class TestCriteria {
/**
* @authorwyq
* @功能:
* @param args
*/
public static void main(String[] args) {
Session session = null;
//新建一個criteria查詢容器
Criteria criteria = session.createCriteria(TUser.class);
/*(1)cireria查詢
* 構造查詢條件,Expression對象具體描述了查詢條件
* 在Hibernate3中,引入了Restrictions類作為Expression的替代
* Expression.eq 等于
* Expression.allEq 參數為一個map包好了多個屬性-值對應關系
* Expression.gt 大于
* Expression.ge 大于等于
* Expression.lt 小于
* Expression.le 小于等于
* Expression.between 表示某個字段位于2個數之間
* Expression.like 模糊查詢
* Expression.in 范圍查詢
* Expression.eqProperty 用于比較2個屬性之間的值"field=field"
* Expression.gtProperty 屬性1>屬性2
* Expression.geProperty 屬性1>=屬性2
* Expression.ltProperty 屬性1<屬性2
* Expression.leProperty 屬性1<=屬性2
* Expression.and and關系組合
* Expression.or or關系組合
* Expression.sql 通過這個方法直接通過SQL語句限定查詢條件
*/
criteria.add(Expression.eq("name","Erica"));
criteria.add(Expression.eq("sex",new Integer(1)));
/*(2)示例查詢
* Example類實現了Criterion接口,同樣,它也可以用作Criteria的查詢條件。Example
* 的作用是:根據已有對象,查找屬性與之相符的其他對象
* 示例查詢最常用的場景是組合查詢。我們常常需要在界面上提供若干查詢選項,然后
* 根據用戶的選擇返回符合條件的結果。
* 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)復合查詢
* 在原有查詢的基礎上,針對TUser對象的addresses屬性構造了新的查詢過濾條件
*/
Criteria addCriteria = criteria.createCriteria("addresses");
addCriteria.add(Expression.like("address", "%Shanghai%"));
/*
* (4)DetachedCriteria
* 使Criteria脫離session實例獨立存在,這樣,我們就可以將某些通用的Criteria
* 查詢條件進行抽離,每次使用時再與當前Session實例綁定以獲得更好的代碼重用效果
*/
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)高級特性
* 通過criteria.setFirstResult/setMaxResults方法可以限制一次查詢返回的記錄范圍:
*/
creiterias.setFirstResult(100);
creiterias.setMaxResults(20);
/*
* 排序
*/
creiterias.addOrder(Order.asc("name"));
/*
* 分組與統計
* 分組、統計表達式由Hibernate3新引入的Projections Class進行封裝
* 按照age分組查詢
* Projections.groupProperty()方法實際上是對SQL group by子句的封裝。同
* 樣,我們可以通過Projections.avg(),rowCount(),count(),max(),min(),countDistinct()
* 等方法實現查詢統計功能
*/
creiterias.setProjection(Projections.groupProperty("age"));
}
}
posted on 2009-11-05 11:23
王永慶 閱讀(323)
評論(0) 編輯 收藏 所屬分類:
HIBERNATE