a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 113|回复: 0

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

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
Java认证之Hibernate中Criteria的用法(3)
4 |5 q  p& I  A  |5 |1 `6 e0 U8 Y' |2 Q4 B
6. 查询示例
6 h5 Z  L, _$ yorg.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。2 y' g7 C, u  k( }7 r6 D* J
Cat cat = new Cat();3 C% C& H+ `: y) V8 y: m7 R8 L
cat.setSex(‘F’);
, c2 K3 N7 u) W8 Hcat.setColor(Color.BLACK);
9 n4 D; @7 {/ o3 ]( n7 ~5 gList results = session.createCriteria(Cat.class)
3 g( Z' s2 V0 Q( P: Y5 D.add( Example.create(cat) ). e7 _0 V" B& m! a) {: ~6 Q
.list();+ n- O, o2 Q6 Y: I& S
版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。可以自行调整Example使之更实用。
( ^) Q" N$ g7 ]6 v% U4 P0 CExample example = Example.create(cat)
1 ]+ b/ d, F, @* ]( l$ o.excludeZeroes() //exclude zero valued properties# i6 x% a  d8 L
.excludeProperty(“color”) //exclude the property named “color”2 J1 F- _+ I+ ?8 r0 }
.ignoreCase() //perform case insensitive string comparisons
$ N- ~6 F" b0 n.enableLike(); //use like for string comparisons
+ D8 o) R* W/ ]- SList results = session.createCriteria(Cat.class)0 @8 T5 }) _( C* `; o
.add(example)0 x) }- F, e6 M/ s; b, w* e9 [
.list();
, c3 P- h; _( z/ U3 q甚至可以使用examples在关联对象上放置条件。, z3 E6 D2 Q' o) R: H9 |
List results = session.createCriteria(Cat.class). r6 D' K0 Y# r7 @+ F& b, G7 A* u: S
.add( Example.create(cat) )
3 A7 e( C* r/ ?( X' k+ y/ A5 |0 D.createCriteria(“mate”)
. v1 r* Y8 l4 C0 M! s. r6 V' e.add( Example.create( cat.getMate() ) )1 j$ z" ~4 ^- j" f; O" r, U
.list();
$ I& P9 _7 V8 y4 ?4 l" ?8 O7. 投影(Projections)、聚合(aggregation)和分组(grouping)# K; s& _8 ]7 p& a8 L
org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用setProjection()应用投影到一个查询。
! n) s( h. U' J" B. E' P8 D# u" |List results = session.createCriteria(Cat.class)& S: b) L% s7 L' t( n: X1 z# l- ]" _
.setProjection( Projections.rowCount() )9 A& O1 Z4 g0 _' K7 a
.add( Restrictions.eq(“color”, Color.BLACK) )
  R7 p/ K8 ~3 Z' F. ^.list();
) p6 P: p4 R% |List results = session.createCriteria(Cat.class)
  V, i0 d3 Y' n+ ?.setProjection( Projections.projectionList()1 U  }! ?, K7 `9 l! P3 d
.add( Projections.rowCount() )6 b1 ?8 _5 q0 ~" v. g6 x) q
.add( Projections.avg(“weight”) )
/ i9 f; O8 s3 u.add( Projections.max(“weight”) )) M! s3 X- N4 r, m4 N8 p
.add( Projections.groupProperty(“color”) )  H$ z, s, Z' y
5 U% _3 ]* R' C1 Q' V
.list();' `( h' q$ \5 a$ I; Y
在一个条件查询中没有必要显式的使用 “group by” 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。1 x% A& S; x2 D: }8 P! v9 y
可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式:# F8 N* R) e  _, t) Z7 m
List results = session.createCriteria(Cat.class)  U1 Z! S+ y6 u+ u% B% `
.setProjection( Projections.alias( Projections.groupProperty(“color”), “colr” ) )
, k* \- Q$ B7 u6 L0 y.addOrder( Order.asc(“colr”) )( C- t' g; \) B# X2 v  ~2 \, g
.list();
  k4 C, m+ T$ u9 D) S. nList results = session.createCriteria(Cat.class)
7 V, b8 R  A) r/ Z. f.setProjection( Projections.groupProperty(“color”).as(“colr”) )' A* x: L0 s8 X9 f2 {
.addOrder( Order.asc(“colr”) ); x6 U/ i! W# D" w" J- a
.list();
1 O3 X8 n* F3 N5 `7 kalias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:1 G& e8 a2 _" v/ w6 @# D( {3 r
List results = session.createCriteria(Cat.class)' ?$ I- X4 _8 V' C
.setProjection( Projections.projectionList()
  i5 G5 h# C/ n6 g! n3 Q0 |.add( Projections.rowCount(), “catCountByColor” )
+ s5 `! a: n6 W3 b/ Y.add( Projections.avg(“weight”), “avgWeight” )
5 X+ G  x2 b' Y3 g; D, `7 t.add( Projections.max(“weight”), “maxWeight” )
# Q* I5 W' ~) K! {.add( Projections.groupProperty(“color”), “color” )9 o9 ?& I% g7 M7 r  T1 _6 l

9 l" x7 D# R; r* s5 S.addOrder( Order.desc(“catCountByColor”) )
# |1 ^6 ^: j7 F6 G- ~+ O.addOrder( Order.desc(“avgWeight”) )' B# o; x+ l! O8 a0 t
.list();
/ ?0 b5 x3 O& B4 u- u+ d  b: HList results = session.createCriteria(Domestic.class, “cat”)
2 t( P; V" ?7 P- `' o/ e+ K.createAlias(“kittens”, “kit”)
) U' L" @( O7 Y.setProjection( Projections.projectionList()3 a2 G+ t7 {; Y" B
.add( Projections.property(“cat.name”), “catName” )/ P4 a/ l, U1 L! X6 G* s
.add( Projections.property(“kit.name”), “kitName” )% j; m3 W6 o4 F  e& b' k/ y0 K0 W
, B: q( r' O* |* v( q1 J+ ^
.addOrder( Order.asc(“catName”) )  V5 q8 {8 K. W$ e
.addOrder( Order.asc(“kitName”) )* ^- L% U" d) c. N: ?0 z
.list();0 U" K& |* k% Y! p0 X" L, D
也可以使用Property.forName()来表示投影:5 a5 Z& m! F3 G/ P6 w  W
List results = session.createCriteria(Cat.class)0 [" T/ s1 X' Z# e0 K4 u# A
.setProjection( Property.forName(“name”) )
7 N5 q* k7 j: l% z( @8 L.add( Property.forName(“color”).eq(Color.BLACK) )
. e1 b$ U' D" s) @.list();
4 Q8 ?7 \: n& E' Z8 A! p& gList results = session.createCriteria(Cat.class)
, N+ v8 k( H: k7 J/ \, Y.setProjection( Projections.projectionList()
! r* {) X9 u2 N  e.add( Projections.rowCount().as(“catCountByColor”) )
2 R5 l8 X6 \! K& Q9 L1 h.add( Property.forName(“weight”).avg().as(“avgWeight”) )( a# k7 F0 X# c: m. r% x  e
.add( Property.forName(“weight”).max().as(“maxWeight”) )  p: a5 h+ R$ ]4 e
.add( Property.forName(“color”).group().as(“color” )
9 ^% I4 A, v- S. n  G6 a5 T$ p
! [% v2 c; b# v0 x! }.addOrder( Order.desc(“catCountByColor”) )" H3 D5 s( z- P4 c4 B5 D4 R+ _- L! [
.addOrder( Order.desc(“avgWeight”) )! W) Q" b; y$ w9 ~/ K
.list();
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 01:55 , Processed in 0.353239 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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