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和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    常用工具
    域名解析过程
    生成免费SSL通配证书
    Windows10环境下loadrunner11 安装
    Jenkins邮件扩展(Email Extension插件 Windows环境)
    Jenkins配置HTML报告(Windows环境)
    jenkins 构建一个maven项目
    jmeter+maven 的简单使用 记录(Windows环境)
    Jenkins 邮件发送设置(jenkins自带邮件设置)
    jmeter建立JDBC连接池时遇到“A Test is currently running,stop or shutdown test to execute this command”
  • 原文地址:https://www.cnblogs.com/growithus/p/11012441.html
Copyright © 2011-2022 走看看