




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1. Hibernate中Criteria的完整用法 2. 最近在项目中使用Spring和Hibernate进行开发,有感于Criteria比较好用,在查询方法 3. 4. 设计上可以灵活的根据Criteria的特点来方便地进行查询条件的组装。现在对Hibernate的Criteria的用法进行总结: 5. Hibernate设计了CriteriaSpecification作为Criteria的父接口,下面提供了Criteria和DetachedCriteria。 6. Criteria和DetachedCriteria的主要区别在于创建的形式不一样,Criteria是在线的,所 7. 以它是由HibernateSession进行创建的;而DetachedCriteria是离线的,创建时无需 8. Session,DetachedCriteria提供了2个静态方法forClass(Class)或forEntityName(Name) 9. 进行DetachedCriteria实例的创建。Spring的框架提供了getHibernateTemplate 10. ().findByCriteria(detachedCriteria)方法可以很方便地根据DetachedCriteria来返回查询结 11. 果。 12. Criteria和DetachedCriteria均可使用Criterion和Projection设置查询条件。可以设 13. 置FetchMode(联合查询抓取的模式),设置排序方式。对于Criteria还可以设置FlushModel 14. (冲刷Session的方式)和LockMode(数据库锁模式)。 15. 下面对Criterion和Projection进行详细说明。 16. Criterion是Criteria的查询条件。Criteria提供了add(Criterioncriterion)方法来 17. 添加查询条件。 18. Criterion接口的主要实现包括:Example、Junction和Simpl*。而 19. Junction的实际使用是它的两个子类conjunction和disjunction,分别是使用AND和OR操 20. 作符进行来联结查询条件集合。 21. Criterion的实例可以通过Restrictions工具类来创建,Restrictions提供了大量的静态 22. 方法,如eq(等于)、ge(大于等于)、between等来方法的创建Criterion查询条件 23. (Simpl*实例)。除此之外,Restrictions还提供了方法来创建conjunction和 24. disjunction实例,通过往该实例的add(Criteria)方法来增加查询条件形成一个查询条件集合 25. 。 26. 至于Example的创建有所不同,Example本身提供了一个静态方法create(Object 27. entity),即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些 28. 过滤条件: 29. ExampleexampleUser=Example.create(u) 30. .ignoreCase()/忽略大小写 31. .enableLike(MatchMode.ANYWHERE); 32. /对String类型的属性,无论在那里值在那里都匹配。相当于%value% 33. Project主要是让Criteria能够进行报表查询,并可以实现分组。Project主要有 34. SimpleProjection、ProjectionList和Property三个实现。其中SimpleProjection和 35. ProjectionList的实例化是由内建的Projections来完成,如提供的avg、count、max、 36. min、sum可以让开发者很容易对某个字段进行统计查询。 37. Property是对某个字段进行查询条件的设置,如通过Porperty.forName(“color”).in 38. (newString“black”,”red”,”write”);则可以创建一个Project实例。通过 39. criteria的add(Project)方法加入到查询条件中去。 40. 使用Criteria进行查询,主要要清晰的是Hibernate提供了那些类和方法来满足开发中查 41. 询条件的创建和组装,下面介绍几种用法: 42. 1.创建一个Criteria实例 43. org.hibernate.Criteria接口表示特定持久类的一个查询。Session是Criteria实例的工厂。 44. Criteriacrit=sess.createCriteria(Cat.class); 45. crit.setMaxResults(50); 46. Listcats=crit.list(); 47. 48. 2.限制结果集内容 49. 一个单独的查询条件是org.hibernate.criterion.Criterion接口的一个实例。 50. 51. org.hibernate.criterion.Restrictions类定义了获得某些内置Criterion类型的工厂方法。 52. Listcats=sess.createCriteria(Cat.class) 53. .add(Restrictions.like(name,Fritz%) 54. .add(Restrictions.between(weight,minWeight,maxWeight) 55. .list(); 56. 57. 约束可以按逻辑分组。 58. 59. Listcats=sess.createCriteria(Cat.class) 60. .add(Restrictions.like(name,Fritz%) 61. .add(Restrictions.or( 62. Restrictions.eq(age,newInteger(0), 63. Restrictions.isNull(age) 64. ) 65. .list(); 66. 67. Listcats=sess.createCriteria(Cat.class) 68. .add(Restrictions.in(name,newStringFritz,Izi,Pk) 69. .add(Restrictions.disjunction() 70. .add(Restrictions.isNull(age) 71. .add(Restrictions.eq(age,newInteger(0) 72. .add(Restrictions.eq(age,newInteger(1) 73. .add(Restrictions.eq(age,newInteger(2) 74. ) 75. .list(); 76. 77. Hibernate提供了相当多的内置criterion类型(Restrictions子类),但是尤其有用的是可以允许 78. 79. 你直接使用SQL。 80. 81. Listcats=sess.createCriteria(Cat.class) 82. .add(Restrictions.sql(lower()likelower(?),Fritz%, 83. 84. Hibernate.STRING) 85. .list(); 86. 87. alias占位符应当被替换为被查询实体的列别名。 88. Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName()创建一个 89. 90. Property。 91. 92. Propertyage=Property.forName(age); 93. Listcats=sess.createCriteria(Cat.class) 94. .add(Restrictions.disjunction() 95. .add(age.isNull() 96. .add(age.eq(newInteger(0) 97. .add(age.eq(newInteger(1) 98. .add(age.eq(newInteger(2) 99. ) 100. .add(Property.forName(name).in(newStringFritz,Izi,Pk) 101. .list(); 102. 103. 3.结果集排序 104. 你可以使用org.hibernate.criterion.Order来为查询结果排序。 105. 106. Listcats=sess.createCriteria(Cat.class) 107. .add(Restrictions.like(name,F%) 108. .addOrder(Order.asc(name) 109. .addOrder(Order.desc(age) 110. .setMaxResults(50) 111. .list(); 112. 113. Listcats=sess.createCriteria(Cat.class) 114. .add(Property.forName(name).like(F%) 115. .addOrder(Property.forName(name).asc() 116. .addOrder(Property.forName(age).desc() 117. .setMaxResults(50) 118. .list(); 119. 120. 4.关联 121. 你可以使用createCriteria()非常容易的在互相关联的实体间建立约束。 122. 123. Listcats=sess.createCriteria(Cat.class) 124. .add(Restrictions.like(name,F%) 125. .createCriteria(kittens) 126. .add(Restrictions.like(name,F%) 127. .list(); 128. 129. 130. 注意第二个createCriteria()返回一个新的Criteria实例,该实例引用kittens集合中的元素。 131. 接下来,替换形态在某些情况下也是很有用的。 132. 133. Listcats=sess.createCriteria(Cat.class) 134. .createAlias(kittens,kt) 135. .createAlias(mate,mt) 136. .add(Restrictions.eqProperty(,) 137. .list(); 138. 139. 140. (createAlias()并不创建一个新的Criteria实例。) 141. Cat实例所保存的之前两次查询所返回的kittens集合是没有被条件预过滤的。如果你希望只获得 142. 143. 符合条件的kittens,你必须使用returnMaps()。 144. 145. Listcats=sess.createCriteria(Cat.class) 146. .createCriteria(kittens,kt) 147. .add(Restrictions.eq(name,F%) 148. .returnMaps() 149. .list(); 150. Iteratoriter=cats.iterator(); 151. while(iter.hasNext() 152. Mapmap=(Map)iter.next(); 153. Catcat=(Cat)map.get(Criteria.ROOT_ALIAS); 154. Catkitten=(Cat)map.get(kt); 155. 156. 157. 5.动态关联抓取 158. 你可以使用setFetchMode()在运行时定义动态关联抓取的语义。 159. 160. Listcats=sess.createCriteria(Cat.class) 161. .add(Restrictions.like(name,Fritz%) 162. .setFetchMode(mate,FetchMode.EAGER) 163. .setFetchMode(kittens,FetchMode.EAGER) 164. .list(); 165. 166. 这个查询可以通过外连接抓取mate和kittens。 167. 168. 6.查询示例 169. org.hibernate.criterion.Example类允许你通过一个给定实例构建一个条件查询。 170. 171. Catcat=newCat(); 172. cat.setSex(F); 173. cat.setColor(Color.BLACK); 174. Listresults=session.createCriteria(Cat.class) 175. .add(Example.create(cat) 176. .list(); 177. 178. 179. 版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。 180. 可以自行调整Example使之更实用。 181. 182. Exampleexample=Example.create(cat) 183. .excludeZeroes()/excludezerovaluedproperties 184. .excludeProperty(color)/excludethepropertynamedcolor 185. .ignoreCase()/performcaseinsensitivestringcomparisons 186. .enableLike();/uselikeforstringcomparisons 187. Listresults=session.createCriteria(Cat.class) 188. .add(example) 189. .list(); 190. 191. 192. 甚至可以使用examples在关联对象上放置条件。 193. 194. Listresults=session.createCriteria(Cat.class) 195. .add(Example.create(cat) 196. .createCriteria(mate) 197. .add(Example.create(cat.getMate() 198. .list(); 199. 200. 201. 7.投影(Projections)、聚合(aggregation)和分组(grouping) 202. org.hibernate.criterion.Projections是Projection的实例工厂。我们通过调用 203. 204. setProjection()应用投影到一个查询。 205. 206. Listresults=session.createCriteria(Cat.class) 207. .setProjection(Projections.rowCount() 208. .add(Restrictions.eq(color,Color.BLACK) 209. .list(); 210. 211. Listresults=session.createCriteria(Cat.class) 212. .setProjection(PjectionList() 213. .add(Projections.rowCount() 214. .add(Projections.avg(weight) 215. .add(Projections.max(weight) 216. .add(Projections.groupProperty(color) 217. ) 218. .list(); 219. 220. 221. 在一个条件查询中没有必要显式的使用groupby。某些投影类型就是被定义为分组投影,他 222. 223. 们也出现在SQL的groupby子句中。 224. 225. 可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的 226. 227. 实现方式: 228. 229. Listresults=session.createCriteria(Cat.class) 230. .setProjection(Projections.alias(Projections.groupProperty(color),colr) 231. .addOrder(Order.asc(colr) 232. .list(); 233. 234. 235. 236. Listresults=session.createCriteria(Cat.class) 237. .setProjection(Projections.groupProperty(color).as(colr) 238. .addOrder(Order.asc(colr) 239. .list(); 240. 241. alias()和as()方法简便的将一个投影实例包装到另外一个别名的Projection实例中。简而言之, 242. 243. 当你添加一个投影到一个投影列表中时你可以为它指定一个别名: 244. 245. Listresults=session.createCriteria(Cat.class) 246. .setProjection(PjectionList() 247. .add(Projections.rowCount(),catCountByColor) 248. .add(Projections.avg(weight),avgWeight) 249. .add(Projections.max(weight),maxWeight) 250. .add(Projections.groupProperty(color),color) 251. ) 252. .addOrder(Order.desc(catCountByColor) 253. .addOrder(Order.desc(avgWeight) 254. .list(); 255. 256. 257. Listresults=session.createCriteria(Domestic.class,cat) 258. .createAlias(kittens,kit) 259. .setProjection(PjectionList() 260. .add(Pperty(),catName) 261. .add(Pperty(),kitName) 262. ) 263. .addOrder(Order.asc(catName) 264. .addOrder(Order.asc(kitName) 265. .list(); 266. 267. 268. 也可以使用Property.forName()来表示投影: 269. 270. Listresults=session.createCriteria(Cat.class) 271. .setProjection(Property.forName(name) 272. .add(Property.forName(color).eq(Color.BLACK) 273. .list(); 274. Listresults=session.createCriteria(Cat.class) 275. .setProjection(PjectionList() 276. .add(Projections.rowCount().as(catCountByColor) 277. .add(Property.forName(weight).avg().as(avgWeight) 278. .add(Property.forName(weight).max().as(maxWeight) 279. .add(Property.forName(color).group().as(color) 280. ) 281. .addOrder(Order.desc(catCountByColor) 282. .addOrder(Order.desc(avgWeight) 283. .list(); 284. 285. 286. 8.离线(detached)查询和子查询 287. DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的Session来 288. 289. 执行它。 290. 291. DetachedCriteriaquery=DetachedCriteria.forClass(Cat.class) 292. .add(Property.forName(sex).eq(F); 293. /创建一个Session 294. Sessionsession=.; 295. Transactiont
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国家用装饰用木制品项目创业计划书
- 中国辣椒种植项目创业计划书
- 中国口腔护理用品项目创业计划书
- 中国计算机断层成像项目创业计划书
- 2025租房合同协议书样本
- 中国脑机接口项目创业计划书
- 中国肛门袋项目创业计划书
- 政工程建设施工合同书
- 乐清保安考试题及答案
- 德化红旗瓷厂历史风貌区保护提升工程二期可行性研究报告
- 施工组织设计施工方案报审表
- 3D扫描与模型重建
- 雅马哈YS12编程手册
- 县政府工作调动文件范本
- 组合数学(第二版)递推关系
- 现代企业管理理论与实务
- 《新求精德语强化教程 中级Ⅱ》(第三版)学习指南【词汇短语+单元语法+课文精解+全文翻译+练习答案】
- 中式婚礼流程及主持词
- 美国超声心动图学会推荐的成人右心功能评价指南的解读
- 三病信息管理制度
- 慢病健康管理 高血压患者随访评估与分类干预
评论
0/150
提交评论