Java_hibernate 之Criteria 与 DetachedCriteria查询

最近在做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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值