zoukankan      html  css  js  c++  java
  • Hibernate的Criteria的使用

    http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

    使用Criteria進行查詢時,不僅僅能組合出SQL中where子句的功能,還可以組合出如排序、統計、分組等的查詢功能。

    • 排序
    您可以使用Criteria進行查詢,並使用org.hibernate.criterion.Order對結果進行排序,例如使用Oder.asc(),指定根據”age”由小到大排序(反之則使用desc()):
    Criteria criteria = session.createCriteria(User.class);
    criteria.addOrder(Order.asc("age"));
    List users = criteria.list();


    注意在加入Order條件時,使用的是addOrder()方法,而不是add()方法,在產生SQL語句時,會使用order by與asc(desc)來進行排序指定:


    Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ order by this_.age asc


    • 限定查詢筆數
    Criteria的setMaxResults()方法可以限定查詢回來的筆數,如果配合setFirstResult()設定傳回查詢結果第一筆資料的位置,就可以實現簡單的分頁,例如傳回第51筆之後的50筆資料(如果有的話):
    Criteria criteria = session.createCriteria(User.class);
    criteria.setFirstResult(51);
    criteria.setMaxResults(50);
    List users = criteria.list();


    根據您所指定得資料庫,Hibernate將自動產生與資料庫相依的限定筆數查詢子句,例如在MySQL中,將使用limit產生以下的SQL語句:


    Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ limit ?, ?

    • 統計動作
    您可以對查詢結果進行統計動作,使用 org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min ()、 countDistinct()等方法,再搭配Criteria的setProjection()方法加入條件設定,例如對查詢結果的"age"作平均:
    Criteria criteria = session.createCriteria(User.class);
    criteria.setProjection(Projections.avg("age"));
    List users = criteria.list();


    上面的程式將由Hibernate自動產生SQL的avg函數進行平均計算:


    Hibernate: select avg(this_.age) as y0_ from T_USER this_


    • 分組
    還可以配合Projections的groupProperty()來對結果進行分組,例如以"age"進行分組,也就是如果資料中"age"如果有 20、20、25、30,則以下會顯示20、25、30:
    Criteria criteria = session.createCriteria(User.class);
    criteria.setProjection(Projections.groupProperty("age"));
    List users = criteria.list();


    上面的程式將由Hibernate自動產生SQL的group by子句進行分組計算:


    Hibernate: select this_.age as y0_ from T_USER this_ group by this_.age


    如果想同時結合統計與分組功能,則可以使用org.hibernate.criterion.ProjectionList,例如下面的程式會計算每個年齡各有多少個人:
    ProjectionList projectionList = Projections.projectionList();
    projectionList.add(Projections.groupProperty("age"));
    projectionList.add(Projections.rowCount());

    Criteria criteria = session.createCriteria(User.class);
    criteria.setProjection(projectionList);
    List users = criteria.list();



    觀察所產生的SQL語句,將使用group by先進行分組,再針對每個分組進行count函數的計數,


    Hibernate: select this_.age as y0_, count(*) as y1_ from T_USER this_ group by this_.age


    • 根據已知物件進行查詢
    設定查詢條件並非一定要使用Restrictions,如果屬性條件很多,使用Restrictions也不方便,如果有一個已知的物件,則可以根據這個物件作為查詢的依據,看看是否有屬性與之類似的物件,例如:
    User user = new User();
    user.setAge(new Integer(30));

    Criteria criteria = session.createCriteria(User.class);
    criteria.add(Example.create(user));

    List users = criteria.list();


    您可以透過 org.hibernate.criterion.Example的create()方法來建立Example實例,Example實作了 Criteria介面,因此可以使用add()方法加入至Criteria條件設定之中,Hibernate將自動過濾掉空屬性,根據已知物件上已設定的 屬性,判定是否產生於where子句之中:

    Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=?)


    • 設定SQL範本
    如果您了解如何撰寫SQL語句,想要設定一些Hibernate產生SQL時的範本,您也可以使用Restrictions的sqlRestriction()方法,提供SQL語法範本作限定查詢,例如查詢name以cater開頭的資料:
    Criteria criteria = session.createCriteria(User.class);
    criteria.add(Restrictions.sqlRestriction(
                  "{alias}.name LIKE (?)", "cater%", Hibernate.STRING));
    List users = criteria.list();
    其中alias將被替換為與User類別相關的名稱,而? 將被替換為cater%,也就是第二個參數所提供的值,sqlRestriction()方法第一個參數所設定的是where子句的部份,所以在SQL撰 寫時,不必再寫where,觀察所產生的SQL語句,將使用您所設定的SQL範本作為基礎,來完成SQL的條件查詢:


    Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.name LIKE (?)


    如果有多個查詢條件,例如between子句的查詢,則可以如下:
    Criteria criteria = session.createCriteria(User.class);
    Integer[] ages = {new Integer(20), new Integer(40)};
    Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER};
    criteria.add(Restrictions.sqlRestriction(
                   "{alias}.age BETWEEN (?) AND (?)", ages, types));
    List users = criteria.list();


    觀察所產生的SQL語句如下:


    Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age BETWEEN (?) AND (?)
     
     
  • 相关阅读:
    浅析VO、DTO、DO、PO的概念、区别和用处
    serialVersionUID的作用
    Eclipse Debug提示source not found解决方案
    eclipse的块选择模式
    Java工程Properties配置文件注释中文,会自动转换为其他编码方式问题解决 中文乱码
    spring boot1.5以上版本@ConfigurationProperties取消location注解后的替代方案 cannot resolve method location
    c++11多线程
    多媒体指令(AVX加速数组求和)
    oracle数据库occi接口写入中文乱码解决方法
    c++得到窗口句柄
  • 原文地址:https://www.cnblogs.com/wucg/p/2626768.html
Copyright © 2011-2022 走看看