最近在做hibernate查询封装时,发现Hibernate 提供的Criteria接口查询方法还是蛮好用的,对sql语句不熟的同学来说可能是福音。 org.hibernate.Criteria对SQL进行封装,您可以通过Criteria进行组合各种查询条件,由Hibernate自动为您产生 SQL语句。官方给出的定义如下:
public interface Criteria extends CriteriaSpecification
Criteria is a simplified API for retrieving entities by composing Criterion objects. This is a very convenient approach for functionality like "search" screens where there is a variable number of conditions to be placed upon the result set.
Criteria是由session创建管理的,创建方法为session.createCriteria(),该方法返回一个Criteria实例,通过Criteria实例的add的方法我们可以自由添加查询条件,由Criteria.add(Criteria arg)方法可知criteria其实相当于一个条件查询的容器,我们只要向这个容器加入我们要查询条件的实例,hibernate自动会帮我们生成相对应的SQL。接下去我们该知道怎么创建查询条件,要设定查询条件,则要使用org.hibernate.criterion.Restrictions的各种静态方法传回 org.hibernate.criterion.Criteria实例,传回的每个org.hibernate.criterion.Criteria 实例代表着一个条件,接下我们就通过Criterria.add(Criteria arg)方法添加这些查询条件。说了那么多,我们开始用代码来讲解。
Criterria criteria = Session.createCriteria(User.class);//User.class 告诉hibernate去找User类对应的数据库表
criteria.add(Restrictions.eq("username","lan"));//username代表User类对应的一个属性,Restrictions.eq()相当匹配属性为username值为lan的User对象。
criteria.add(Restrictions.gt("age",20));//这句相当于匹配属性值为age并且值大于20的User对象。
criteria.addOrder(Order.asc("age"));//按照age的asc进行排序
criteria.setFirstResult(0);//从第一条开始取
criteria.setMaxResults(50);//设置返回上限
List user = criteria.list();//返回查询结果集
Restrictions还提供各种条件函数,比如大于等于,小于等于,like,in,or,between等。从上面我们可以看到我们不熟悉sql语句照样可以进行数据库查询操作。criteria还可以进行关联对象查询,我们使用createCriteria()在互相关联的实体间建立约束。如下:
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.createCriteria("kittens")//Cat中有个关联字段属性为kittens
.add( Restrictions.like("name", "F%")//这句就是在新的实例中查找关联对象中name
.list();
注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。
还有一种方法如下:
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")//创建Kittens关联对象的别名kt
.createAlias("mate", "mt")//创建mate关联对象的别名mt
.add( Restrictions.eqProperty("kt.name", "mt.name") )//调用别名对象,查询关联对象name属性一样的结果集
.list();
这两种方法都是查询关联对象。
为了能够重复使用Criteria查询条件,在Hibernate 3中新增了org.hibernate.criterion.DetchedCriteria,您可以先建立DetchedCriteria实例,并加入 各种查询条件,并于需要查询时再与Session绑定,获得一个绑定Session的Criteria的实例。DetachedCriteria 类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。 DetachedCriteria也可以用以表示子查询。
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Cat.class)
.add( Restrictions.eq("sex","male") );
detachedCriteria.add( Restrictions.like("name", "F%");
Criterria criteria = detachedCriteria .getExecutableCriteria(Session);
List cat = criteria.list();