注:在新版本的hibernate中, Expression关键字已经改为Restrictions关键字
Criteria接口用处最多的地方为Expression.in(), 这个比HQL和session.createSQLQuery都要好用。此接口的其他查询表达式就不怎么常用了,还是HQL和session.createSQLQuery用的方便。格式为:
Expression.in(String propertyName, Collection values)
Expression.in(String propertyName, Object[] values)
两个小例子:
- Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } )
- Set<Integer> conds = new TreeSet<Integer>();
- conds.add(new Integer(1));
- conds.add(new Integer(2));
- criteria.add(Expression.in("id", conds));
Criteria Query: 可以看作传统sql的对象化表示
Criteria本身只是一个查询容器,具体的查询条件需要通过Criteria.add()方法添加到Criteria实例中。而Expression对象则描述了这些查询条件。
针对SQL语法,Expression提供了对应的查询限定机制。
Criteria由session创建
Criteria criteria = session.createCriteria(TestCase.class); //参数为被操作的pojo类, 反射机制.
Criteria中可以增加查询条件
criteria.add(Expression.eq("uid", "forrest"));
criteria.add(Expression.eq("id", new Integer(id)));
Criteria查询表达式:
Expression.eq(对象属性名, 对象属性值) --> 对应SQL "field=value" 表达式
Expression.allEq(Map map) --> 参数为Map对象,其中包含了多个"key-value"关系,相当于多个Expression.eq()的叠加
Expression.gt(对象属性名, 对象属性值) --> 对应SQL "field>value" 表达式
Expression.ge(对象属性名, 对象属性值) --> 对应SQL "field>=value" 表达式
Expression.lt(对象属性名, 对象属性值) --> 对应SQL "field<value" 表达式
Expression.le(对象属性名, 对象属性值) --> 对应SQL "field<=value" 表达式
Expression.betweeen("age", new Integer(15), new Integer(25)) --> 对应SQL "between" 表达式
Expression.like("uid", "%forr%") --> 对应SQL "field like value" 表达式
Expression.in() --> 对应SQL "field in" 表达式
Expression.eqProperty() --> 比较两个属性之间的值。对应SQL "field=field" 表达式。Expression.eqProperty("User.groupId", "group.id");
Expression.geProperty() --> 比较两个属性之间的值。对应SQL "field>field" 表达式
Expression.gtProperty() --> 比较两个属性之间的值。对应SQL "field>=field" 表达式
Expression.ltProperty() --> 比较两个属性之间的值。对应SQL "field<field" 表达式
Expression.leProperty() --> 比较两个属性之间的值。对应SQL "field<=field" 表达式
Expression.and --> and关系组合。Expression.and(Expression.eq("uid", "forrest"), Expression.eq.("password", "abc"));
补充:Criteria接口也可通过使用多个Criteria.add(Expression)方法实现Criteria.add(Expression.and())
Expression.or --> or关系组合
Expression.sql --> 作为Expression对象的补充,本方法提供对原生sql的支持
Example类实现了Criterion接口,它也可以用作Criteria的查询条件:根据已有对象查询属性与之相符的其他对象。
当查询条件比较多的时候,可以用Example查询来简化代码(用Example是精确匹配).例如:
testCase.setTid("tc01");
testCase.setEntered_by("forrest");
criteria.add(Example.create(testCase));
复合查询
Criteria查询可以嵌套Criteria来实现复合查询
如下:
Criteria ct=session.createCriteria(TUser.class);
Criteria ctAddress=ct.createCriteria("addresses");//这里是嵌套了一个Criteria查询,这里的addresses是TUser的属性
ctAddress.add(Expression.like("address","%shanghai%"));
List list=ct.list();
具体请参见hibernate帮助文档:条件查询(Criteria Queries)