Atitit.Hibernate中Criteria 使用總結and 關聯查詢 and 按照子物件查詢 o9o,hibernatecriteria

來源:互聯網
上載者:User

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......餘下全文>>
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.