Java认证之Hibernate中Criteria的用法(4)/ x! k1 |4 m! Z ^- \
8. 离线(detached)查询和子查询
( \' @' E$ ^+ CDetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。
& ~5 Y0 ?' d" w$ z' t; jDetachedCriteria query = DetachedCriteria.forClass(Cat.class)- d( i; @+ R8 U; d. Z2 X
.add( Property.forName(“sex”).eq(‘F’) );
# u6 C4 T2 ]* ?9 W N( C& G//创建一个Session
6 F$ i; ]; a) m' j8 l% wSession session = 。;- a/ ]* E: G( \2 }3 L' _9 Q
Transaction txn = session.beginTransaction();
- `+ D3 {/ Y. J+ o9 J, e! VList results = query.getExecutableCriteria(session).setMaxResults(100).list(); h# ]! N2 b) k5 H& U P
txn.commit();" c8 ?2 o! w. E" Y3 K" F8 ~
session.close();
5 u4 t. q! ^) g, ^: ^2 e7 NDetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。
+ j q6 e: M* f" `DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class), a' `. j& I* H7 g1 j0 V. H& o D
.setProjection( Property.forName(“weight”).avg() );
) M G3 B2 u. u8 A$ W# Dsession.createCriteria(Cat.class)9 ?2 I) w* F* G
.add( Property.forName(“weight).gt(avgWeight) )& o R5 i9 E+ X, h0 a
.list();' Y! m6 d% e/ s7 [6 d
DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
; R! T' R \# B% j/ m- Q) j.setProjection( Property.forName(”weight“) );
( _0 R& P& [/ bsession.createCriteria(Cat.class)
3 i$ G H6 I8 s1 Z: y. c! e.add( Subqueries.geAll(”weight
* ~% q. a: J3 L* q# ]( d相互关联的子查询也是有可能的:
+ }# n& B9 \" E4 b& {- @. BDetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, “cat2”)5 i* F& o2 u. K2 O
.setProjection( Property.forName(“weight”).avg() )# a# [$ ~- H- `
.add( Property.forName(“cat2.sex”).eqProperty(“cat.sex”) );% p1 t5 o p& e8 r# K" c0 w N
session.createCriteria(Cat.class, “cat”)" D$ d; ?8 U) q
.add( Property.forName()) |