zoukankan      html  css  js  c++  java
  • Hibernate3的DetachedCriteria使用

    Criteria對SQL進行封裝,讓開發人員可以用物件的方式來對資料庫進行操作,例如下面的查詢User表格中的所有資料:

    Criteria criteria = session.createCriteria(User.class);
    // 查詢user所有欄位
    List users = criteria.list();
    Iterator iterator =  users.iterator();
    System.out.println("id \t name/age");
    while(iterator.hasNext()) {
        User user = (User) iterator.next();
        System.out.println(user.getId() +
                                   " \t " + user.getName() +
                                   "/" + user.getAge());           
    }


    Hibernate實際上使用以下的SQL來查詢資料庫:

    select this_.id as id0_, this_.name as name0_0_, this_.age as age0_0_ from user this_


    Criteria實際上只是個容器,如果想要設定查詢條件,則要使用add()方法加入Restrictions的條件限制,例如查詢age大於20且小於40的資料:

    Criteria criteria = session.createCriteria(User.class);
    criteria.add(Restrictions.gt("age", new Integer(20)));
    criteria.add(Restrictions.lt("age", new Integer(40)));
    List users = criteria.list();


    您也可以使用邏輯組合來進行查詢,例如結合age等於(eq)20或(or)age為空(isNull)的條件:

    Criteria criteria = session.createCriteria(User.class);
    criteria.add(Restrictions.or(
                       Restrictions.eq("age", new Integer(20)),
                       Restrictions.isNull("age")
                   ));
    List users = criteria.list();


    也可以使用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%,也就是第二個參數所提供的值,在SQL撰寫時,不必再寫WHERE,如果有多個查詢條件,例如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();


    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關係
    Restrictions.sqlRestriction SQL限定查詢


     

    ==============

    Hibernate Criteria 关联查询

    前面讲了Criteria看起来比HQL顺眼多了,接着继续。

    如果每个美女都有自己的客户资源(不要想歪了!),那么需要查询拥有客户Gates的美女怎么办?

    使用Criteria可以有两种方法:

    1:
    DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class).createCriteria("customers");
    beautyCriteria.add(Restrictions.eq("name", "Gates")):

    2:
    DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class).createAlias("customers", "c");
    beautyCriteria.add(Restrictions.eq("c.name", "Gates")):

    接着有了新的要求,年纪太大的美女不要,还是查找拥有客户Gates的,条件如下:
    DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class, "b").;
    DetachedCriteria customerCriteria = beautyCriteria.createAlias("customers", c");
    beautyCriteria.add(Restrictions.le("b.age", new Long(20))):
    customerCriteria.add(Restrictions.eq("c.name", "Gates")):

    关于Criteria更详细的资料,Hibernate的源代码和测试是最好的文档。

    成长的乐趣,在于分享!
    大龄程序员,一路走来,感慨颇多。闲暇时写写字,希望能给同行人一点帮助。
    本文版权归作者growithus和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    使用 Dockerfile 定制镜像
    UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)
    UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)
    LeetCode Best Time to Buy and Sell Stock 买卖股票的最佳时机 (DP)
    LeetCode Number of Islands 岛的数量(DFS,BFS)
    LeetCode Triangle 三角形(最短路)
    LeetCode Swap Nodes in Pairs 交换结点对(单链表)
    LeetCode Find Minimum in Rotated Sorted Array 旋转序列找最小值(二分查找)
    HDU 5312 Sequence (规律题)
    LeetCode Letter Combinations of a Phone Number 电话号码组合
  • 原文地址:https://www.cnblogs.com/growithus/p/11012440.html
Copyright © 2011-2022 走看看