打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
hibernate的Criteria条件查询

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

1.初解

快速浏览了资料,大致了解了以下的内容:

 1. Hibernate 定义了CriteriaSpecification接口规范用来完成面向对象的条件查询,Criteria 和 DetachedCriteria 就是CriteriaSpecification的子接口。

 2. Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样,Criteria 是在线创建,即由session创建的;DetachedCriteria 是离线的,创建时无需 Session,                DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 实例的创建

 3. Restrictions 是工具类,它可以创建Criterion 的实例

 也是囫囵吞枣的看了下,下面直接进入测试:

2.如何使用

1.查所有

  /**     * 作用:查所有     * 说明:通过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();    }

2.条件查询

  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关系

3.排序

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

4.关联

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();    }

5.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();    }

 就先记录到这里,手抖中~~~~~~

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Hibernate---Criteria 查询
[转] Hibernate3的DetachedCriteria支持 - 影寻 - 网易博客
hibernate Restrictions用法
Hibernate的DetachedCriteria使用(含Criteria)
Hibernate 复合查询 - Winbomb - 网易博客
Hibernate QBC查询
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服