hibernate

  1. 具有一个直观的、可扩展的条件查询API是Hibernate的特色。      
  2. #      
  3. 15.1. 创建一个Criteria 实例     
  4. # org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。      
  5. #      
  6. # Criteria crit = sess.createCriteria(Cat.class);     
  7. # crit.setMaxResults(50);     
  8. # List cats = crit.list();     
  9. 15.2. 限制结果集内容     
  10. # 一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。      
  11. #      
  12. # List cats = sess.createCriteria(Cat.class)     
  13. #     .add( Restrictions.like("name""Fritz%") )     
  14. #     .add( Restrictions.between("weight", minWeight, maxWeight) )     
  15. #     .list();     
  16. # 约束可以按逻辑分组。      
  17. #      
  18. # List cats = sess.createCriteria(Cat.class)     
  19. #     .add( Restrictions.like("name""Fritz%") )     
  20. #     .add( Restrictions.or(     
  21. #         Restrictions.eq( "age"new Integer(0) ),     
  22. #         Restrictions.isNull("age")     
  23. #     ) )     
  24. #     .list();     
  25. # List cats = sess.createCriteria(Cat.class)     
  26. #     .add( Restrictions.in( "name"new String[] { "Fritz""Izi""Pk" } ) )     
  27. #     .add( Restrictions.disjunction()     
  28. #         .add( Restrictions.isNull("age") )     
  29. #      .add( Restrictions.eq("age"new Integer(0) ) )     
  30. #      .add( Restrictions.eq("age"new Integer(1) ) )     
  31. #      .add( Restrictions.eq("age"new Integer(2) ) )     
  32. #     ) )     
  33. #     .list();     
  34. # Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。      
  35. #      
  36. # List cats = sess.createCriteria(Cat.class)     
  37. #     .add( Restrictions.sql("lower({alias}.name) like lower(?)""Fritz%", Hibernate.STRING) )     
  38. #     .list();     
  39. # {alias}占位符应当被替换为被查询实体的列别名。      
  40. #      
  41. # Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。      
  42. #      
  43. # Property age = Property.forName("age");     
  44. # List cats = sess.createCriteria(Cat.class)     
  45. #     .add( Restrictions.disjunction()     
  46. #         .add( age.isNull() )     
  47. #      .add( age.eq( new Integer(0) ) )     
  48. #      .add( age.eq( new Integer(1) ) )     
  49. #      .add( age.eq( new Integer(2) ) )     
  50. #     ) )     
  51. #     .add( Property.forName("name").in( new String[] { "Fritz""Izi""Pk" } ) )     
  52. #     .list();     
  53. 15.3. 结果集排序     
  54. # 你可以使用org.hibernate.criterion.Order来为查询结果排序。      
  55. #      
  56. # List cats = sess.createCriteria(Cat.class)     
  57. #     .add( Restrictions.like("name""F%")     
  58. #     .addOrder( Order.asc("name") )     
  59. #     .addOrder( Order.desc("age") )     
  60. #     .setMaxResults(50)     
  61. #     .list();     
  62. # List cats = sess.createCriteria(Cat.class)     
  63. #     .add( Property.forName("name").like("F%") )     
  64. #     .addOrder( Property.forName("name").asc() )     
  65. #     .addOrder( Property.forName("age").desc() )     
  66. #     .setMaxResults(50)     
  67. #     .list();     
  68. 15.4. 关联     
  69. # 你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。      
  70. #      
  71. # List cats = sess.createCriteria(Cat.class)     
  72. #     .add( Restrictions.like("name""F%")     
  73. #     .createCriteria("kittens")     
  74. #         .add( Restrictions.like("name""F%")     
  75. #     .list();     
  76. # 注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。      
  77. #      
  78. # 接下来,替换形态在某些情况下也是很有用的。      
  79. #      
  80. # List cats = sess.createCriteria(Cat.class)     
  81. #     .createAlias("kittens""kt")     
  82. #     .createAlias("mate""mt")     
  83. #     .add( Restrictions.eqProperty("kt.name""mt.name") )     
  84. #     .list();     
  85. # (createAlias()并不创建一个新的 Criteria实例。)      
  86. #      
  87. # Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用returnMaps()。      
  88. #      
  89. # List cats = sess.createCriteria(Cat.class)     
  90. #     .createCriteria("kittens""kt")     
  91. #         .add( Restrictions.eq("name""F%") )     
  92. #     .returnMaps()     
  93. #     .list();     
  94. # Iterator iter = cats.iterator();     
  95. while ( iter.hasNext() ) {     
  96. #     Map map = (Map) iter.next();     
  97. #     Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);     
  98. #     Cat kitten = (Cat) map.get("kt");     
  99. # }     
  100. 15.5. 动态关联抓取     
  101. # 你可以使用setFetchMode()在运行时定义动态关联抓取的语义。      
  102. #      
  103. # List cats = sess.createCriteria(Cat.class)     
  104. #     .add( Restrictions.like("name""Fritz%") )     
  105. #     .setFetchMode("mate", FetchMode.EAGER)     
  106. #     .setFetchMode("kittens", FetchMode.EAGER)     
  107. #     .list();     
  108. # 这个查询可以通过外连接抓取mate和kittens。 查看第 19.1 节 “ 抓取策略(Fetching strategies) ”可以获得更多信息。      
  109. #      
  110. 15.6. 查询示例     
  111. # org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。      
  112. #      
  113. # Cat cat = new Cat();     
  114. # cat.setSex('F');     
  115. # cat.setColor(Color.BLACK);     
  116. # List results = session.createCriteria(Cat.class)     
  117. #     .add( Example.create(cat) )     
  118. #     .list();     
  119. # 版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。      
  120. #      
  121. # 你可以自行调整Example使之更实用。      
  122. #      
  123. # Example example = Example.create(cat)     
  124. #     .excludeZeroes()           //exclude zero valued properties     
  125. #     .excludeProperty("color")  //exclude the property named "color"     
  126. #     .ignoreCase()              //perform case insensitive string comparisons     
  127. #     .enableLike();             //use like for string comparisons     
  128. # List results = session.createCriteria(Cat.class)     
  129. #     .add(example)     
  130. #     .list();     
  131. # 你甚至可以使用examples在关联对象上放置条件。      
  132. #      
  133. # List results = session.createCriteria(Cat.class)     
  134. #     .add( Example.create(cat) )     
  135. #     .createCriteria("mate")     
  136. #         .add( Example.create( cat.getMate() ) )     
  137. #     .list();     
  138. 15.7. 投影(Projections)、聚合(aggregation)和分组(grouping)     
  139. # org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。      
  140. #      
  141. # List results = session.createCriteria(Cat.class)     
  142. #     .setProjection( Projections.rowCount() )     
  143. #     .add( Restrictions.eq("color", Color.BLACK) )     
  144. #     .list();     
  145. # List results = session.createCriteria(Cat.class)     
  146. #     .setProjection( Projections.projectionList()     
  147. #         .add( Projections.rowCount() )     
  148. #         .add( Projections.avg("weight") )     
  149. #         .add( Projections.max("weight") )     
  150. #         .add( Projections.groupProperty("color") )     
  151. #     )     
  152. #     .list();     
  153. # 在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。      
  154. #      
  155. # 你可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式:      
  156. #      
  157. # List results = session.createCriteria(Cat.class)     
  158. #     .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )     
  159. #     .addOrder( Order.asc("colr") )     
  160. #     .list();     
  161. # List results = session.createCriteria(Cat.class)     
  162. #     .setProjection( Projections.groupProperty("color").as("colr") )     
  163. #     .addOrder( Order.asc("colr") )     
  164. #     .list();     
  165. # alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:      
  166. #      
  167. # List results = session.createCriteria(Cat.class)     
  168. #     .setProjection( Projections.projectionList()     
  169. #         .add( Projections.rowCount(), "catCountByColor" )     
  170. #         .add( Projections.avg("weight"), "avgWeight" )     
  171. #         .add( Projections.max("weight"), "maxWeight" )     
  172. #         .add( Projections.groupProperty("color"), "color" )     
  173. #     )     
  174. #     .addOrder( Order.desc("catCountByColor") )     
  175. #     .addOrder( Order.desc("avgWeight") )     
  176. #     .list();     
  177. # List results = session.createCriteria(Domestic.class"cat")     
  178. #     .createAlias("kittens""kit")     
  179. #     .setProjection( Projections.projectionList()     
  180. #         .add( Projections.property("cat.name"), "catName" )     
  181. #         .add( Projections.property("kit.name"), "kitName" )     
  182. #     )     
  183. #     .addOrder( Order.asc("catName") )     
  184. #     .addOrder( Order.asc("kitName") )     
  185. #     .list();     
  186. # 你也可以使用Property.forName()来表示投影:      
  187. #      
  188. # List results = session.createCriteria(Cat.class)     
  189. #     .setProjection( Property.forName("name") )     
  190. #     .add( Property.forName("color").eq(Color.BLACK) )     
  191. #     .list();     
  192. # List results = session.createCriteria(Cat.class)     
  193. #     .setProjection( Projections.projectionList()     
  194. #         .add( Projections.rowCount().as("catCountByColor") )     
  195. #         .add( Property.forName("weight").avg().as("avgWeight") )     
  196. #         .add( Property.forName("weight").max().as("maxWeight") )     
  197. #         .add( Property.forName("color").group().as("color" )     
  198. #     )     
  199. #     .addOrder( Order.desc("catCountByColor") )     
  200. #     .addOrder( Order.desc("avgWeight") )     
  201. #     .list();     
  202. 15.8. 离线(detached)查询和子查询     
  203. class=hilite1>DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。      
  204. #      
  205. class=hilite1>DetachedCriteria query = class=hilite1>DetachedCriteria.forClass(Cat.class)     
  206. #     .add( Property.forName("sex").eq('F') );     
  207. #          
  208. # Session session = ....;     
  209. # Transaction txn = session.beginTransaction();     
  210. # List results = query.getExecutableCriteria(session).setMaxResults(100).list();     
  211. # txn.commit();     
  212. # session.close();     
  213. class=hilite1>DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。      
  214. #      
  215. class=hilite1>DetachedCriteria avgWeight = class=hilite1>DetachedCriteria.forClass(Cat.class)     
  216. # .setProjection( Property.forName("weight").avg() );     
  217. # session.createCriteria(Cat.class)     
  218. # .add( Property.forName("weight).gt(avgWeight) )     
  219. # .list();     
  220. class=hilite1>DetachedCriteria weights = class=hilite1>DetachedCriteria.forClass(Cat.class)     
  221. # .setProjection( Property.forName("weight") );     
  222. # session.createCriteria(Cat.class)     
  223. # .add( Subqueries.geAll("weight", weights) )     
  224. # .list();     
  225. # 甚至相互关联的子查询也是有可能的:      
  226. #      
  227. class=hilite1>DetachedCriteria avgWeightForSex = class=hilite1>DetachedCriteria.forClass(Cat.class"cat2")     
  228. # .setProjection( Property.forName("weight").avg() )     
  229. # .add( Property.forName("cat2.sex").eqProperty("cat.sex") );     
  230. # session.createCriteria(Cat.class"cat")     
  231. # .add( Property.forName("weight).gt(avgWeightForSex) )     
  232. # .list();     
  233. #       
  234. #      
  235. #  //具体应用     
  236. #      
  237. # 把HSQL语句用Criteria代替,感觉更加美观一点,而且还支持中文,要是HSQL想支持中文,你得使用占位符来设置,具体可参照:http://.blogdriver.com//983190.html     
  238. #      
  239. # 那么Criteria的用法是这样的:     
  240. #      
  241. #     public Collection findCriteria(final class=hilite1>DetachedCriteria dc, final IPage page) {     
  242. #         return (List) getHibernateTemplate().execute(new HibernateCallback(){     
  243. #             public Object doInHibernate(Session session) throws HibernateException, SQLException {     
  244. #                 Criteria c = dc.getExecutableCriteria(session);     
  245. #                      
  246. #                 page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());      
  247. #                 c.setProjection(null);      
  248. #                 c.setResultTransformer(Criteria.ROOT_ENTITY);     
  249. #                 c.setFirstResult(page.getBeginIndex());     
  250. #                 c.setMaxResults(page.getPageSize());     
  251. #                 return c.list();     
  252. #             }     
  253. #         }, true);     
  254. #     }     
  255. #      
  256. # 其中的参数true表示要Spring强制传入SessionImpl,而不是传入Proxy代理类,page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());      
  257. # c.setProjection(null); 目的是为了获得行数,并设置投影为空,为的是返回List出来,如果不设置setProjection(null)的话,c.list将返回的是行数(int型),而不是所要查询的数据库信息。但是Criteria的ResultTransformer会变成 PassThroughResultTransformer,criteria.list的时候可能结果会跟理想的不一样。所以我们还要再 c.setResultTransformer(Criteria.ROOT_ENTITY);把结果以Entity的形式返回,而不是Object[] 的形式返回。具体的ResultTransformer可以google一下。     
  258. #      
  259. # 测试代码如下:     
  260. #      
  261. #     public void testCriteria() {     
  262. #         class=hilite1>DetachedCriteria dc = class=hilite1>DetachedCriteria.forClass(User.class);     
  263. #         dc.add(Restrictions.eq("name""user")).add(Restrictions.like("description""%主管人员%"));     
  264. #         IPage page = new Page();     
  265. #         page.setCurrentPage(1);     
  266. #         page.setPageSize(10);     
  267. #         Collection list = _userDAO.findCriteria(dc, page);     
  268. #         assertNotNull(list);     
  269. #         assertEquals(1, list.size());     
  270. #     }    

你可能感兴趣的:(Hibernate,hibernate,session,integer,null,list,spring)