准备使用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’)
其实就是先建好一个这样的例子,然后以后的查询就按着我这样做的来.
分享到:
相关推荐
Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询
Hibernate中Criteria的完整用法
Hibernate中Criteria的完整用法
criteria的相关知识及其介绍,便于java编程中使用criteria进行相关操作。
Hibernate的Criteria用法总结Hibernate的Criteria用法总结
整体总结Hibernate中的Criteria的用法!
Hibernate-Criteria_模糊查询
DetachedCriteria Criteria 使用方法 非常详细外加练习
Criteria标准化对象查询小例子,内有配套的SQL表语句和使用说明
关于Hibernate操作持久化类的Criteria方式的书本方法
Hibernate Criteria 排序的問題
hibernate criteria的使用方法
Hibernate中Criteria的用法
Multi-Criteria Chinese Word Segmentationwith Transformer 译文 谷歌翻译版,仅供参考
Hibernate中Criteria的完整用法
Hibernate-Criteria 模糊查询
一个项目不一定只有一种类型的数据源,如何屏蔽掉不同数据库的差异呢?hibernate在这方面做得很好,同时Criteria虽然不比HQL用得广泛,但是效率比它高,而且对于特定项目,它表现得很灵活。
Hibernate中Criteria的完整用法 Criteria 是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现、SQL语句如何...