條件查詢一般是通過以下三個類完成的:
1、Criteria:代表一次查詢
2、Criterion:代表一個查詢條件
3、Restriction:代表查詢條件的工具類
執行條件查詢的步驟如下:
1、獲得Hibernate的Session對象
2、以Session對象創建Criteria對象
3、使用Restriction的靜態方法創建Criterion查詢條件
4、向Criteria查詢中添加Criterion查詢條件
5、執行Criterion的list()方法或者uniqueResult()方法返回結果集
示例:
[java]
public void query(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//使用ctiteria進行條件查詢
List list = session.createCriteria(Person.class)
.add(Restrictions.eq("id", 1))
.list();
for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person person = (Person) iterator.next();
System.out.println(person.getName());
}
}
Criteria對象本身並不具備任何數據過濾篩選功能,但程序可以通過向Criteria對象中組合多個Criterion(每一個Criterion對象代表瞭一個數據過濾條件)即可實現數據過濾。
Criteria包含如下兩個方法:
setFristResult(int firstResult):設置查詢返回的第一行記錄
setMaxResult(int maxResult):設置查詢返回的記錄數
這兩個方法用於查詢分頁
Criteria還包含如下幾個常用的方法:
add(Criterion criterion):增加查詢條件
addOrder(Order order):增加排序規則
[java]
List list = session.createCriteria(Person.class)
.add(Restrictions.like("name", "李%")) //增加查詢條件
.addOrder(Order.desc("name")) //結果集排序
.setMaxResults(50) //返回的記錄數最多為50條
.list(); //返回結果集
Criterion接口代表瞭一個查詢條件,該查詢條件有Restrictions負責產生。Restrictions是專門用於產生查詢條件的工具類,它的方法大部分是靜態方法。
一、關聯
如果需要使用關聯實體的屬性來增加查詢條件,則應該對該屬性再次使用createCriteria方法。
[java]
List list = session.createCriteria(Person.class)
.createAlias("myEvent", "e")
.add(Restrictions.like("e.title", "工業大學%"))
.list();
第二個createCriteria返回一個新的Criteria實例,該實例引用Person類中的myEvent關聯屬性。title是MyEvent類中的屬性。
接下來,替換形態在某些情況下也是很有用的。
[java]
List list = session.createCriteria(Person.class)
.add(Restrictions.like("name", "李%"))
.setFetchMode("myEvent", FetchMode.JOIN)
.list();
createAlias()方法並不創建一個新的Criteria實例,它隻是給關聯實體起一個別名,讓後面的過濾條件可根據該關聯實體進行篩選。
二、動態關聯
在默認情況下,條件查詢將根據映射文件指定的延遲加載策略來加載關聯實體,如果希望在條件查詢中改變延遲加載策略,可以通過setFetchMode()方法來控制。setFetchMode()方法接受一個FetchMode參數。
DEFAULT:使用配置文件指定的延遲加載策略處理
JOIN:使用外連接、預初始化所有關聯實體
SELECT:啟用延遲加載,系統將使用單獨的select語句來初始化關聯實體。隻有當真正訪問關聯實體的時候,才會執行第二條select語句。
。。。。。。。。。。。。。。。。。。。。。。。。。。。
使用外連接方式抓取Myevent。
三、投影、聚合、分組
Hibernate的條件過濾中使用Projection代表投影運算,Projection是一個接口,而Projections作為Projection的工廠,負責生成Projection對象。
一旦產生瞭Projection對象之後,就可以通過setProjection(Projection projection)方法來進行投影運算瞭。
[java]
List list = session.createCriteria(Person.class)
.setProjection(Projections.projectionList()
.add( Projections.avg("age"))
.add(Projections.groupProperty("name")))
.list();
在一個條件查詢中沒有必要顯式的使用 "group by" 。某些投影類型就是被定義為分組投影,他們也出現在SQL的group by子句中。
如果我們希望對分組後屬性進行排序,那就需要為投影運算指定一個別名瞭,有兩種方法可以為投影運算指定別名
1、使用alias()方法
[java]
List list = session.createCriteria(Person.class)
.setProjection(Projections.alias(Projections.groupProperty("name"), "name"))
.addOrder(Order.asc("age"))
.list();
2、使用as()方法為自身指定別名
[java]
List list = session.createCriteria(Person.class)
.setProjection(Projections.groupProperty("name").as("name"))
.addOrder(Order.asc("age"))
.list();
也可以使用Property.forName()來表示投影:
[java] www.aiwalls.com
List list = session.createCriteria(Person.class)
.setProjection(Projections.projectionList()
.add(Property.forName("name")))
.list();
四、離線查詢和子查詢
條件查詢的離線查詢有DetachedCriteria來代表,DetachedCriteria類允許在一個session范圍外創建一個 查詢,並且可以使用任意Session來執行它。
[java]
public void detachedCriteriaTest(){
//定義一個離線查詢
DetachedCriteria query = DetachedCriteria.forClass(Person.class).setProjection(Property.forName("name"));
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//執行離線查詢
List list = query.getExecutableCriteria(session).list();
for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person person = (Person) iterator.next();
System.out.println(person.getName());
}
}
另外DetachedCriteria還可以代表子查詢,當我們把DetachedCriteria傳入Criteria中作為查詢條件時,DetachedCriteria就變成瞭子查詢。
[java]
public void subQuery(){
//定義一個離線查詢
DetachedCriteria query = DetachedCriteria.forClass(Person.class).setProjection(Property.forName("name"));
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//執行子查詢
List list = session.createCriteria(Person.class)
.add(Property.forName("name").in(query))
.list();
for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person person = (Person) iterator.next();
System.out.println(person.getName());
}
}
作者:chenssy