Atitit.Hibernate中Criteria 使用總結and 關聯查詢 and 按照子物件查詢 o9o,hibernatecriteria
Atitit.Hibernate中Criteria 使用總結and 關聯查詢 and 按照子物件查詢 o9o
1. Criteria,,Criterion ,, 1
<2. 主要的對象黑頭配置磊個關聯,三 1
3. Criteria 黑頭配置關聯查詢了... 2
4. Ati Meata 配置關聯 @CriteriaRelt 2
5. 關聯createCriteria() 3
6. Criteria的使用outline 4
7. 參考:: 5
1. Criteria,,Criterion ,,
Criteria是一種比hql更物件導向的查詢方式。Criteria 可使用 Criterion 和 Projection 設定查詢條件。可以設定 FetchMode( 聯集查詢抓取的模式 ) ,設定排序方式,Criteria 還可以設定 FlushModel (沖刷 Session 的方式)和 LockMode (資料庫鎖模式)。
2. 主要的對象黑頭配置磊個關聯,三
public class GvPlayRecord
Equipment eq;
/**
// attilax 老哇的爪子 5_u_8 o9n
* @return the eq
*/
@ManyToOne
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumn(name = "equipment_id", insertable = false,updatable = false)
@RemoteProperty
public Equipment getEq() {
return eq;
}
Criteria c = new BaseSvs(). getSession().createCriteria(GvPlayRecord.class);
SimpleExpression se= Restrictions.eq("eq.dpt.groupid", 114 );
//c.add(se);
List list = c.list();
三說新不上 eq.dpt.groupid 屬性...好像直黑頭的配置不生效..
作者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請註明來源: http://blog.csdn.net/attilax
3. Criteria 黑頭配置關聯查詢了...
Criteria c = new BaseSvs(). getSession().createCriteria(GvPlayRecord.class);
Criteria eqCri=c.createCriteria("eq");
eqCri.add(Restrictions.eq("departId", 117 ));
中間才行蘭...
4. Ati Meata 配置關聯 @CriteriaRelt
@CriteriaRelt(fld="departId")
Equipment eq;
架構處理code
//yash condition process. def
SqlAti_Criteria sql=new SqlAti_Criteria();
sql.reqMap=QueryPropertyssMap;
sql.Criteria=c;
sql.setCls(cls). addWhereExp(fld);
@SuppressWarnings("all") public SqlAti addWhereExp(Field fld) {
CriteriaRelt an=fld.getAnnotation(CriteriaRelt.class);
if(an!=null)
{
Criteria crSub=this.Criteria.createCriteria(fld.getName());
crSub.add( Restrictions.eq(an.fld(), this.reqMap.get(an.fld())));
}
return this;
}
5. 關聯createCriteria()
4.
5.
你可以使用createCriteria()非常容易的在互相關聯的實體間建立 約束。
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.createCriteria("kittens")
.add( Restrictions.like("name", "F%")
.list();
注意第二個 createCriteria()返回一個新的 Criteria執行個體,該執行個體引用kittens 集合中的元素。
接下來,替換形態在某些情況下也是很有用的。
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add( Restrictions.eqProperty("kt.name", "mt.name") )
.list();
(createAlias()並不建立一個新的 Criteria執行個體。)
Cat執行個體所儲存的之前兩次查詢所返回的kittens集合是 沒有被條件預過濾的。如果你希望只獲得
合格kittens, 你必須使用returnMaps()。
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Restrictions.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}
6. Criteria的使用outline
5. 動態關聯抓取
6. 6. 查詢樣本
org.hibernate.criterion.Example類允許你通過一個給定執行個體 構建一個條件查詢。
7. 7. 投影(Projections)、彙總(aggregation)和分組(grouping)
8. 8. 離線(detached)查詢和子查詢
7. 參考::
Hibernate中Criteria的完整用法 - LifeNote - BlogJava.htm
問hibernate Criteria 怎進行子物件關聯查詢,
第一個:
Criteria criteria = hibernateTemplate.getSessionFactory().getCurrentSession().createCriteria(Dept.class);
criteria.add(Restrictions.like("name", "%aa%"));
第二個:
Criteria criteria = hibernateTemplate.getSessionFactory().getCurrentSession().createCriteria(Dept.class);
Criteria senduser = criteria.createCriteria("a");//這個小a是Dept中關聯A.class的屬性名稱
criteria.add(Restrictions.like("name", "%AA%"));
最後返回
return criteria.list();
Hibernate中Criteria的對象欄位怎查詢?
到了Hibernate3.0以後,關聯關係的對象預設都是使用消極式載入,例如<one-to-many時.但我在映射<one-to-one,<many-to-one關係時指定了lazy="true",但是在查詢對象時,我只想查詢一個對象,仍然會把這個對象所關聯的<one-to-one,<many-to-one對象一起查詢出來,這樣造成了極大的效能浪費.在不指定lazy屬性時,<many-to-one所關聯的對象反而會消極式載入,這讓我大為困惑,還以為是Hibernate的bug.
在網上尋找資料,說在為了消極式載入<one-to-one,<many-to-one所關聯的對象,需要設定被關聯的對象<class name="" lazy="true",我也這樣做了,但是仍然沒有效果.
仔細閱讀了Hibernate的手冊,才發現原來要消極式載入<one-to-one,<many-to-one所關聯的對象時,除了要指定lazy="true"外,還需要運行期位元組碼增強,而我省去了這一步,所以消極式載入沒有效果.同時還發現在預設情況下,<one-to-one,<many-to-one的lazy屬性是"proxy"而不是"true"!因此如果直接採用lazy的預設值,是可以消極式載入的.
總結一下:<many-to-one預設的屬性是lazy="proxy",此時預設是會消極式載入的.在指定了lazy="true"之後,必須要經過運行期位元組碼增加,消極式載入才有效果.
而<one-to-one相對要複雜一點,消極式載入還要受到constrained屬性的限制.constrained="false"時表明實體和被關聯到的實體的約束不是強制的,即存在一個實體時,它通過<one-to-one關聯的實體可能存在,也可能不存在,這時在查詢實體時,Hibernate總會發起一次查詢檢查<one-to-one所關聯的實體是否存在,而這時已經可以把one-to-one關聯的實體查詢出來了,因此在<one-to-one關係中,如果constrained="false",總是會立即載入關聯到的實體.
如果當constrained="true",且lazy="proxy"(預設),是可以消極式載入的.
如果當constrained="true",且lazy="true"時,需要經過運行期位元組碼增加,消極式載入才會奏效.
如果資料量過大, 當然還是有這個必要. 也可以做到, 但是返回的不會是對象,而是欄位數組.
hibernate 管這叫投影 Criteria criteria=session.createCriteria(User.class);
ProjectionList proList = Projections.projectionList();//設定投影集合 proList.add(Projections.groupProperty("userName")); proList.add(Projections.groupProp......餘下全文>>