准备使用Criteria,看了很多网友的文章,我来总结一下
在Hibernate中有3种表达查询的方法
1、Hibernate查询语言(HQL)
2、用于按条件查询(QBC)和按示例查询(QBE)的Criteria API
3、直接的SQL(使用session的createSQLQuery方法创建)
相信HQL大家都比较熟悉,直接的SQL用的比较少,在此不做介绍。
一、QBC查询
QBC(Query By Criteria)查询方式是 Hibernate 提供的“ 更加面向对象 ”的一种检索方式。 QBC 在条件查询上比 HQL 查询更为灵活,而且支持运行时动态生成查询语句。
在Hibernate应用中使用QBC查询通常经过3个步骤
(1)使用 Session 实例的 createCriteria() 方法创建 Criteria 对象
(2)使用工具类 Restrictions 的相关方法为 Criteria 对象设置查询对象
(3)使用 Criteria 对象的 list() 方法执行查询,返回查询结果
Restrictions类的常用方法
Restrictions.eq(String propertyName,Object value)
等于
Restrictions.allEq(Map propertyNameValues)
使用Map key/value 进行多个等于的比对
Restrictions.gt(String propertyName, Object value)
大于 > (gt----->greater than)
Restrictions.ge(String propertyName, Object value)
大于等于 >= (ge----->greater equal)
Restrictions.It(String propertyName, Object value)
小于< (It---->less than)
Restrictions.Le(String propertyName, Object value)
小于等于<= (le---->less equal)
Restrictions.between(String propertyName, Object lo, Object hi)
对应SQL 语句的 Between 子句
Restrictions.like(String propertyName, Object value)
对应SQL 语句的 LIKE 子句
Restrictions.in(String propertyName, Collection value)
对应SQL 语句的 in 子句
Restrictions.and(Criterion lhs, Criterion rhs)
And关系
Restrictions.or(Criterion lhs, Criterion rhs)
Or关系
Restrictions.sqlRestriction(String sql,Object[] values,Type[] types)
SQL限定查询
工具类Order 提供设置排序方式
Order.asc(String propertyName)
升序排序
Order.desc(String propertyName)
降序排序
工具类Projections 提供对查询结果进行统计与分组操作
Porjections.avg(String propertyName)
求某属性的平均值
Projections.count(String propertyName)
统计某属性的数量
Projections.countDistinct(String propertyName)
统计某属性的不同值的数量
Projections.groupProperty(String propertyName)
指定一组属性值
Projections.max(String propertyName)
某属性的最大值
Projections.min(String propertyName)
某属性的最小值
Projections.projectionList()
创建一个新的projectionList 对象
Projections.rowCount()
查询结果集中记录的条数
Projections.sum(String propertyName)
返回某属性值的合计
创建一个Criteria 实例
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
限制结果集内容
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类定义了获得某些内置Criterion类型的工厂方法。
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add( Restrictions.between("weight", minWeight, maxWeight) )
.list();
约束可以按逻辑分组。
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add( Restrictions.or(
Restrictions.eq( "age", new Integer(0) ),
Restrictions.isNull("age")
)
)
.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) ”可以获得更多信息
[color=red]二、QBE查询[/color]
QBE查询就是检索与指定样本对象具有相同属性值的对象。因此 QBE 查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。 QBE 查询的功能子集,虽然 QBE 没有 QBC 功能大,但是有些场合 QBE 使用起来更为方便。
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list();
将执行以下SQL:
select … from cat where (sex=‘F’ and color=‘B’)
其实就是先建好一个这样的例子,然后以后的查询就按着我这样做的来.