Java认证之Hibernate中Criteria的用法(4)
" k B: b7 F v" j# I" e' K8. 离线(detached)查询和子查询5 P5 r# r: G' h8 K! ~
DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。/ ?2 u2 \2 k: M! A' a9 J2 _1 |5 y
DetachedCriteria query = DetachedCriteria.forClass(Cat.class), ~! v* x6 F3 p0 N! M
.add( Property.forName(“sex”).eq(‘F’) );, p) v3 ]" e- { {8 L" A$ G" e
//创建一个Session) I/ W, B" O$ c( ~
Session session = 。;
& ~3 Z! U' T2 k! RTransaction txn = session.beginTransaction();
% x6 q4 w6 X- ~6 E! D: K) MList results = query.getExecutableCriteria(session).setMaxResults(100).list();
) S* I( B" j& a8 Q3 jtxn.commit();
. X; Z* Y q0 msession.close();0 s) T8 G6 c* E1 Y6 h; S
DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。) u3 ?5 [4 R! H8 U
DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)! V/ D7 C9 y" I9 `0 K
.setProjection( Property.forName(“weight”).avg() );
) x9 w" i/ _/ }session.createCriteria(Cat.class)
* B2 m2 b& v X.add( Property.forName(“weight).gt(avgWeight) )" \8 E" |" _1 P- f4 I! V9 x9 |
.list();
) _& H i& F- z& jDetachedCriteria weights = DetachedCriteria.forClass(Cat.class)0 H( O M2 e% o% L
.setProjection( Property.forName(”weight“) );
4 o* ]2 o6 V8 C) o& Bsession.createCriteria(Cat.class)
- X6 c4 x7 ^9 Y' z. d+ ~3 C7 p.add( Subqueries.geAll(”weight r) w/ X' u- \* E Q3 ]/ m9 i
相互关联的子查询也是有可能的:
# T: f3 b3 r u7 _2 }DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, “cat2”)8 Z# O8 ? w: V
.setProjection( Property.forName(“weight”).avg() )
" K* z! q C$ l* n+ A r* j.add( Property.forName(“cat2.sex”).eqProperty(“cat.sex”) );
2 T, ~( p- V1 B' I5 I7 ^* o* Zsession.createCriteria(Cat.class, “cat”)
8 t* Q8 t. z) t.add( Property.forName()) |