a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 113|回复: 0

[其他] Java认证之Hibernate中Criteria的用法(2)

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
Java认证之Hibernate中Criteria的用法(2)5 u. r# k2 L% j# R) H0 o+ |8 P

5 @: w: X# w$ m" f6 C! f/ m8 `2 b, I4 o' T9 K& G- W) R
.add( Restrictions.between(“weight”, minWeight, maxWeight) ); \$ \$ T% Z) a. l2 E. |+ C5 L
.list();
& H- ]. f; W$ H; G% D2 UHibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。
" m) Z$ v  B) a1 f- eList cats = sess.createCriteria(Cat.class)
9 m1 t2 X1 b% F( C.add( Restrictions.sql(“lower({alias}.name) like lower(?)”, “Fritz%”,
# X% c4 z" `$ C9 J7 j6 Q. CHibernate.STRING) ), i/ D) F, Q# U* h% A
.list();
1 z7 D! P8 I+ `  x8 C$ O# u{alias}占位符应当被替换为被查询实体的列别名。1 p7 G7 v$ F: a9 l" y9 O/ T
Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。$ r! W& k, F+ M' [1 [+ M9 }; v
Property age = Property.forName(“age”);  ~- L, ]$ @" A+ U3 U' Y! V8 H
List cats = sess.createCriteria(Cat.class)
! f. g2 w1 E2 b: g6 d.add( Restrictions.disjunction()" u7 ~3 B% \! ~1 e& A% P6 {' V
.add( age.isNull() )
) w, c+ W0 Y! [, b# \7 E.add( age.eq( new Integer(0) ) )
! ]; {# ~8 ~: x3 P9 a0 K.add( age.eq( new Integer(1) ) )+ N2 Q% r2 i7 R
.add( age.eq( new Integer(2) ) )
4 N+ ^2 l$ F2 R' |) ), `4 {" q3 \' k+ ?7 Y# E
.add( Property.forName(“name”).in( new String[] { “Fritz”, “Izi”, “Pk” } ) )0 S& U% s6 i$ M# t3 ~( N: M3 H- C
.list();" B+ }$ U" D. X& M& G
3. 结果集排序: M: w' l5 n$ R1 ?& k4 r* D
你可以使用org.hibernate.criterion.Order来为查询结果排序。6 K0 q6 W  N5 u3 z5 R
List cats = sess.createCriteria(Cat.class)
" a; Z- o0 l. l' Q* N1 a' P. [3 `0 p.add( Restrictions.like(“name”, “F%”)- ~' H- B- @, R0 t0 W8 J7 n0 b- U( t4 e
.addOrder( Order.asc(“name”) ): ]4 g3 s- E& R) O% b& O7 K
.addOrder( Order.desc(“age”) )' K" D; s; Z6 S+ S0 n) [$ J2 u
.setMaxResults(50)
; A! n+ \! @( M3 o+ x# f9 x.list();, I$ M+ {: {* }
List cats = sess.createCriteria(Cat.class)
* J1 i+ z: K# w$ u* G5 I.add( Property.forName(“name”).like(“F%”) )
0 l! x8 {: L5 }: b+ Y! C.addOrder( Property.forName(“name”).asc() ); a3 e- A6 |/ H( i/ f
.addOrder( Property.forName(“age”).desc() )4 ?( m$ {8 b2 @4 V
.setMaxResults(50)5 L2 B8 h* [1 [7 i
.list();& [+ v0 E7 E. K  @) E9 P- h
4. 关联
9 Y$ [/ f/ v2 G7 W3 M你可以使用createCriteria()非常容易的在互相关联的实体间建立约束。
& ^/ ~9 b- u! k0 `2 ?$ `0 KList cats = sess.createCriteria(Cat.class)
5 S: V% G& Z+ w# O& G: R.add( Restrictions.like(“name”, “F%”)
) o0 h# a& G/ Q.createCriteria(“kittens”)2 j* X# r3 [% F) }5 Z( G
.add( Restrictions.like(“name”, “F%”)$ C9 y8 J! u8 M- ^2 J
.list();1 |2 \& \2 x% F9 @
注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。接下来,替换形态在某些情况下也是很有用的。
  b' [0 ]! ?4 |List cats = sess.createCriteria(Cat.class)! @; }; m4 U9 O2 W
.createAlias(“kittens”, “kt”)- A. Y& O4 b8 m' ^
.createAlias(“mate”, “mt”)
; `' b/ ~; @/ W$ M: J/ Y.add( Restrictions.eqProperty(“kt.name”, “mt.name”) )& i4 `7 M) _$ s1 k4 ]; ^/ y* x' ~
.list();
! p2 g( w3 X% H: p; K2 {, K9 q# {' Y(createAlias()并不创建一个新的 Criteria实例。)
) l5 W; t: P* y9 Z5 l1 @Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用returnMaps()。- V8 W% `& B$ Q* n
List cats = sess.createCriteria(Cat.class)' r* {  e8 r# b0 _9 n
.createCriteria(“kittens”, “kt”)" C, B/ a' w" H- x" V8 v: c8 x, B
.add( Restrictions.eq(“name”, “F%”) )" {, C! t  h( c# l  g' |* e
.returnMaps()/ n9 ?& R$ A: d) o7 y
.list();3 q) P8 V6 Y) U; q2 W
Iterator iter = cats.iterator();
0 V- _) O% e% Q( Y% ~2 iwhile ( iter.hasNext() ) {
; Q) z& j* ~* V+ m: @( M! v6 gMap map = (Map) iter.next();
" ~& g; s7 G7 g9 x0 w* @Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);& V1 f2 I0 c: u/ P
Cat kitten = (Cat) map.get(“kt”);
) Q9 Y$ N; ^# W* U1 d}
7 |6 ^8 N# x0 s* D) C# s  |# l5. 动态关联抓取/ l! s3 A: H! x& B) w  _& A  I
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。
8 l: G/ L" ^/ M  W6 _6 v) xList cats = sess.createCriteria(Cat.class)
+ M' O& e4 ?  F4 S. F. f, Q' ~.add( Restrictions.like(“name”, “Fritz%”) )
5 _6 Q( c; O7 a( v: _.setFetchMode(“mate”, FetchMode.EAGER)
# k/ j* g9 u, s, T+ F- t.setFetchMode(“kittens”, FetchMode.EAGER)
# J: g0 ~! l& v2 D0 q" V; ]2 G.list();
) x$ x" v% s& u! b# o4 B这个查询可以通过外连接抓取mate和kittens。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-5 17:45 , Processed in 0.208107 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表