• Criteria——Hibernate的面向对象查询


            提到Hibernate的查询。我们往往会想到HQL,他使我们的SQL语句面向对象话。

    事实上细看,差点儿相同就是把SQL语句中的表和字段用所相应的实体和属性给取代了。事实上。Hibernate中还有还有一种查询方式,我们看不到任务SQL的影子。那就是Criteria Query。

            Criteria是一种比hql更面向对象的查询方式。

    ——百度百科


    一、 简介

            Criteria Query通过面向对象的设计,将数据查询条件封装为一个对象。简单来说,Criteria Query能够看作是传统SQL的对象化表示,如:

    Criteria criteria=session.createCriteria(TUser.class);
    criteria.add(Expression.eq("name","zhanglianhai"));
    criteria.add(Expression.eq("sex",new Integer(1));
            这里的criteria实例本质上是对SQL“select * from t_user where name='Erica' and sex=1”的封装。Hibernate在执行期会依据Criteria中指定的查询条件生成对应的SQL语句。当然,要想使用Criteria,得知道他的字母符号。如:eq表示“=”。qt表示“>”,le表示“<=”……


    二、 经常使用的相关类

            1. Example类

            Example类实现了Criteria接口,相同,它也能够用作Criteria的查询条件。Example的作用是:依据已有对象,查找属性与之相符的其它对象。

    Criteria criteria=session.CreateCriteria(TUser.class);
    TUser exampleUser=new TUser();
    exapleUser.getName("Erica");
    criteria.add(Example.create(exampleUser));
    
    List<TUser> list=criteria.list();
    
    for(TUser user:list){
        System.out.println(user.getName());
    }
            意思就是,新建一个TUser对象exampleUser,并作为范本。查询全部name属性与之同样的记录。

            2. DetachedCriteria

            Hibernate2中。Criteria生命周期位于其宿主Session生命周期中,也就是说,由某个session创建的Criteria实例。一旦session销毁。那么此Criteria实例也随之失效。Hibernate3中引入了DetachedCriteria,DetachedCriteria能够脱离session实例独立存在。这样。我们就能够将某些通用的Criteria查询条件进行抽离,每次使用时再与当前session实例绑定以获得更好的代码重用效果。

    DetachedCriteria deCriteria=DetachedCriteria.forClass(TUser.class);
    deCriteria.add(Expression.eq("name","Erica"));
    deCriteria.add(Expression.eq("sex",new Integer(1)));
    
    Criteria criteria=deCriteria.getExecutableCriteria(session);
    List<TUser> list=criteria.list();
    for(TUser user:list){
        System.out.println(user.getName());
    }
            DetachedCriteria的生存周期与session实例无关。我们能够独立创建DetachedCriteria实例。并在须要使用时与session相绑定,从而获得执行期Criteria实例。这样,我们就能够将查询逻辑和Criteria实例分离。以获得最大化代码的重用效果。

            DetachedCriteria也能够用于子查询表达:

    DetachedCriteria aveAge=DetachedCriteria.forClass(TUser.class);
    avgAge.setProjection(Projections.avg("age"));
    
    Criteria criteria=session.createCriteria(TUser.class);
    criteria.add(Subqueries.propertyGT("age",avgAge));
            通过Subqueries我们能够将DetachedCriteria纳入查询表达式,反映在SQL上则是一个典型的子查询语句。

    上例生成的SQL语句大致如:select ... from T_User where age > (select avg(age) from T_User)

    三、 高级特性
            1. 限定返回的记录范围

            通过criteria.setFirstResult/setMaxResults方法能够限制一次查询返回的记录范围:

    Criteria criteria=session.createCriteria(TUser.class);
    //限定查询返回检索结果中,从100条结果開始的20条记录
    criteria.setFirstResult(100);
    criteria.setMaxResults(20);
            2. 记录排序
    Criteria criteria=session.createCriteria(TUser.class);
    criteria.add(Expression.eq("groupId",new Integer(2)));
    
    criteria.addOrder(Order.asc("name"));
    criteria.addOrder(Order.desc("groupId"))
            3. 分组与统计

            在Hibernate3中,我们还能够通过Criteria完毕分组和统计。分组、统计表达式由Hibernate3新引入的Projections Class进行封装。

    Criteria criteria=session.createCriteria(TUser.class);
    criteria.setProjection(Projections.groupProperty("age"));
    
    List<TUser> list=criteria.list();
    for(TUser user:list){
        System.out.println(user);
    }
            上例对当前的TUser记录依照年龄进行分组。通过Projections.groupProperty方法,我们指定了用于分组的目标属性“age”。生成的SQL语句:select this.age as y0_ from T_User this_group by this_.age。
            另外,对于多条件组合的统计、分组功能,我们能够借助ProjectionList完毕,以下的样例中,我们统计了各个年龄层次中的用户数量:
    ProjectionList projectionlist=Projections.ProjectionList();
    projectionList.add(Projections.groupProperty("age"));
    projectionList.add9Projections.rowCount());
    
    Criteria criteria=session.createCriteria(TUser.class);
    criteria.setProjection(projectionList);

    四、简评

            种查询方式比較面向对象一些。我也比較喜欢使用这样的查询方式,由于它不用写不论什么的sql或者hql语句。眼下criteria提供的查询条件已经能够满足主要的查询要求。可是复杂的查询还是不怎么行得通。



  • 相关阅读:
    多线程爬取图片(生产者-消费者模式)
    数据结构1_C---单链表的逆转
    Java基础面试知识点总结
    Java工程师必备书单
    Java工程师修炼之路(校招总结)
    Java秋招面经大合集
    我的秋招经验分享(已拿BAT头条网易滴滴)
    听说go语言越来越火了?那么请收下这一份go语言书单吧!
    2020还是AI最火?推荐几本深度学习的书籍帮你入门!
    人工智能真的有那么神秘么,推荐一份机器学习入门书单搞定它!
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7117959.html
Copyright © 2020-2023  润新知