Hibernate学习之---条件查询

条件查询是更具面向对象特色的数据查询方式,条件查询通过如下三个类完成:

  • Criteria:代表一次查询。
  • Criterion:代表一个查询条件。
  • Restrictions:产生查询条件的工具类。

执行条件查询的步骤:

  • 获取Hibernate的Session对象。
  • 以Session对象创建Criteria对象。
  • 使用Restrictions的静态方法创建Criterion查询条件。
  • 向Criteria查询中添加Criterion查询条件。
  • 执行Criteria的list()或uniqueResult()方法返回结果集。
    main{
        List list = session.createCriteria(Student.class).add(Restrictions.gt("name","a")).list();
    }

添加查询的条件是:Student实体的name属性大于字符串”a”(在SQL语句中,字符串之间可以比较大小)。

Criteria包含的方法:

  • Criteria setFirstResult(int firstResult):设置查询返回的第一行记录。
  • Criteria setMaxResults(int maxResults):设置查询返回的记录数。
  • Criteria add(Criterion criterion):增加查询条件。
  • Criteria addOrder(Order order):增加排序规则。
  • List list():返回结果集。
1.关联和动态关联

如果需要使用关联实体的属性来增加查询条件,则应该对属性再次使用createCriteria()方法。

    main{
        List list = session.createCriteria(Student.class).add(Restrictions.gt("studentNumber",200)).createCriteria("enrolments").add(Restrictions.gt("semester",2)).list();
    }

使用关联类的条件查询,依然是查询原有持久化类的实例,而不是查询被关联类的实例。

createAlias()方法是给关联实体(包括集合里包含的关联实体起一个别名,让后面的过滤条件可根据该关联实体进行筛选)。

在默认情况下,条件查询将根据持久化注解指定的延迟加载策略来加载关联实体,如果希望在条件查询中改变延迟加载策略,则可通过Criteria的setFetchMode()方法来实现。

    List list = session.createCriteria(Student.class).add(Restrictions.gt("studentNumber",200)).setFetchMode("enrolments",FetchMode.JOIN).list();
2.投影、聚合和分组

投影运算实际上就是一种基于列的运算,通常用于投影到指定列(也就是过滤其他列,类似于select子句的作用),还可以完成SQL语句中常用的分组、组筛选等功能。
Hibernate的条件过滤中使用Projection代表投影运算,Projection是一个接口,而Projections作为Projection的工厂,负责生成Projection对象。
一旦产生了Projection对象之后,就可通过Criteria提供的setProjection(Projection projection)方法来进行投影运算。从该方法来看,每个Criteria只能接受一个投影运算,而Hibernate提供了一个ProjectionList类,该类是Projection的子类,并可以包含多个投影运算,通过这种方式即可完成多个投影运算。

使用条件查询的投影运算时,不能使用显示的分组子句,但某些投影类型的实质就是分组投影,这些投影运算将出现在SQL的group by子句中。

    main{
        List list = session.createCriteria(Enrolment.class).createAlias("student","s").setProjection(Projection.projectionList().add(Projections.rowCount()).add(Projections.max("s.name")).add(Projections.groupProperty("course"))).list();
    }

对于增加了投影运算后的条件查询,查询返回的结果是数组,数组的前N个元素依次是投影运算的结果,最后一个数组元素才是条件查询得到的实体。

如果希望对分组(投影)后属性进行排序,那就需要为投影运算指定一个别名:

  • 使用Projections.alias()方法指定投影指定别名。
  • 使用SimpleProjection的as()方法为自身指定别名。
  • 使用ProjectionList()的add()方法添加投影时指定别名。
    List list = session.createCriteria(Enrolment.class)
                       .add(Projections.alias(Projections.rowCount(),"c"));

    List list = session.createCriteria(Enrolment.class)
                       .add(Projections.gruopProperty("course").as("c"));

    List list = session.createCriteria(Enrolment.class)
                       .add(Projections.rowCount(),"c"));

Hibernate还提供了Property执行投影运算,Property投影的作用类似于SQL语句中的select,条件查询的结果只有被Property投影的才会被选出。

    List list = session.createCriteria(Student.class).setProjection(Property.forName("name")).list();

上面的条件查询执行的结果不再是Student对象集合,而是name属性所组成的集合。

3.离线查询

条件查询的离线查询由DetachedCriteria来代表,DetachedCriteria类允许在一个Session范围之外创建一个查询,并且可以使用任意Session来执行它。
DetchedCriteria还可代表子查询,当把DetachedCriteria传入Criteria中作为查询条件时,DetachedCriteria就变成了子查询。条件实例包含子查询通过Subqueries或Property来获得。

    //执行离线查询
    public void datached(){
        DetachedCriteria query = DetachedCriteria.forClass(Student.class).setProjection(forName("name"));
        ...打开Session和事务
        List list = query.getExecutableCriteria(session).list();
    }

    //执行子查询
    public void subQuery{
        DetachedCriteria query = DetachedCriteria.forClass(Student.class).setProjection(forName("name"));
        ...打开Session和事务
        List list = session.createCriteria(Student.class)
        //下面两行代码的作用相同,都示范了通过子查询添加查询条件
                           .add(Property.forName("name").in(query))
                           .add(Subqueries.propertyIn("name",subQuery)).list();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值