hibernate -- Criteria查询

项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来

如何使用

查所有

  /**
     * 作用:查所有
     * 说明:通过list(),返回的是实体对象集合
     */
    @Test
    public void test1(){
        //创建连接
        Session session = HibernateUtil.getCurrentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //创建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //业务
        List<User> list = criteria.list();
        for (User user : list) {
            System.out.println(user);
        }
        //关闭事务
        session.close();
    }

条件查询

  1)一个条件

/**
     * 作用:or()用法
     * 说明:通过or()返回的是实体对象集合
     *      add(Criterion criterion)用来添加查询条件
     *      Restrictions通过内置的静态方法,可以创建criterion
     */
//创建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //业务:查询出id为1或为2的用户
        List<User> list = criteria.add(Restrictions.or(Restrictions.eq("id", 1),
                                     Restrictions.eq("id", 2) ))
                                    .list();

  2)多个条件

  /**
     * 作用:多个条件:like()和gt()的用法
     */
//创建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //业务:查询出id大于1,名字中带ji的用户
        List<User> list = criteria.add(Restrictions.like("name","%ji%"))
                                  .add(Restrictions.gt("id", 1))
                                  .list();

  其他的条件就不一一测试了,下面列出常用的Restrictions方法

  Restrictions.eq 等于
  Restrictions.allEq 使用Map,使用key/value进行多个等于的比对
  Restrictions.gt 大于 >
  Restrictions.ge 大于等于 >=
  Restrictions.lt 小于 <
  Restrictions.le 小于等于 <=
  Restrictions.between 对应SQL的BETWEEN子句
  Restrictions.like 对应SQL的LIKE子句
  Restrictions.in 对应SQL的in子句
  Restrictions.and and关系
  Restrictions.or or关系

排序

  /**
     * 作用:排序
     * 说明:通过addOrder()添加排序条件
     *         Order设置排序规则,desc是降序,asc是升序
     */
//创建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //业务:对查询结果,根据id排序
        List<User> list = criteria.addOrder(Order.desc("id"))
                                   .list();

关联

参考 : http://blog.csdn.net/bestlxm/article/details/6735464   

User实体类中有关系属性orders,

数据库中的数据如下:order表中的外键是user_id

  user表:

     order表:

代码如下:

/**
     * 作用:关联
     * 说明:通过createAlias()设置关系属性
     *     对已定义关联关系的,我们可以使用createAlias()来创建属性的别名,然后引用别名进行条件查询,如:
                     这样进行查询时就可得到关联查询后的Parent对象结果集,本例中,User是Parent类
     *         
     * Hibernate打印sql语句如下:
     *  select
            this_.id as id0_1_,
            this_.age as age0_1_,
            this_.birth as birth0_1_,
            this_.name as name0_1_,
            o1_.id as id1_0_,
            o1_.note as note1_0_,
            o1_.price as price1_0_ 
        from
            user50 this_ 
        inner join
            order50 o1_ 
         on this_.id=o1_.user_id 
        where
            o1_.id = ?
            
     * 控制台打印如下:
     * User [userID=1, name=zhangjifeng, age=18, birthday=2016-07-26]
     */
    @Test
    public void test5(){
        //创建连接
        Session session = HibernateUtil.getCurrentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //创建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //业务:
        List<User> list = criteria.createAlias("orders","o")
                                   .add(Restrictions.eq("o.id", 1))
                                   .list();
        for (User user : list) {
            System.out.println(user);
        }
        
        //关闭事务
        session.close();
    }

关联2:createCriteria()

测试代码如下

  /**
     * 第二个createCriteria(),返回的是一个新的实例
     * 打印出user和order
     */
    @Test
    public void test6(){
        //创建连接
        Session session = HibernateUtil.getCurrentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //创建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //业务:
        List list = criteria.createCriteria("orders","o")
                                   .add(Restrictions.eq("o.id", 1))
                                   .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
                                   .list();
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Map map = (Map)iterator.next();
            
//            Set keySet = map.keySet();
            
            Set entrySet = map.entrySet();
            Iterator iterator2 = entrySet.iterator();
            while(iterator2.hasNext()){
                Map.Entry<String, Object> map1 =(Entry<String, Object>) iterator2.next();
                System.out.println(map1.getValue());
            }
        }
        //关闭事务
        session.close();
    }

Projections投影

   1)将结果集中的结果当做行和列集来使用,这与通过JDBC执行select查询获得的数据的使用方式相似。因此,Hibernate也支持属性、统计函数和Group By等查询。

   2)要想使用Hibernate的投影统计功能,首先要从org.hibernate.criterion.Projections工厂类获得org.hibernate.criterion.Projection对象

   3)Hibernate的Projections工厂类包含了以下几个常用的统计函数:

    ① avg(String propertyName):计算属性字段的平均值。

    ② count(String propertyName):统计一个属性在结果中出现的次数。

    ③ countDistinct(String propertyName):统计属性包含的不重复值的数量。

    ④ max(String propertyName):计算属性值的最大值。

    ⑤ min(String propertyName):计算属性值的最小值。

    ⑥ sum(String propertyName):计算属性值的总和。

代码如下:

/**
     * 投影:Projections
     * 统计,重复
     */
    @Test
    public void test8(){
        //创建连接
        Session session = HibernateUtil.getCurrentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //创建criteria 
        Criteria criteria = session.createCriteria(Order.class, "o");
        //业务:
        List<Object[]> list = criteria.setProjection(Projections.projectionList()
                                           .add(Projections.max("price"))
                                           .add(Projections.min("price"))
                                           .add(Projections.avg("price"))
                                           .add(Projections.countDistinct("note")) )
                             .list();
        for (Object[] objects : list) {
            for (Object object : objects) {
                System.out.println(object);
            }
        }
        //关闭事务
        session.close();

获得的结果是单独的属性而不是实体类。例如,一个产品表中包含有很多字段,我们想要获取产品表中的名称和描述,而不需要将完整的实体加载到内存中

  /**
     * 投影:Projections
     * 获取部分字段
     */
    @Test
    public void test9(){
        //创建连接
        Session session = HibernateUtil.getCurrentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //创建criteria 
        Criteria criteria = session.createCriteria(Order.class, "o");
        //业务:
        ProjectionList projList = Projections.projectionList(); 
        projList.add(Projections.property("name")); 
        projList.add(Projections.property("price")); 
        criteria.setProjection(projList); 
        List result = criteria.list(); 
        for (Object object : result) {
            System.out.println(object);
        }
        //关闭事务
        session.close();
    }

 

posted @ 2016-07-30 22:05  liuconglin  阅读(11030)  评论(0编辑  收藏  举报