为什么80%的码农都做不了架构师?>>>   

<p>原文地址:<a href="http://blog.csdn.net/lanshengsheng2012/article/details/8982922">http://blog.csdn.net/lanshengsheng2012/article/details/8982922</a></p> <p>要對資料庫管理系統進行操作,最基本的就是使用SQL(Standard Query Language)語句,大部份的資料庫都支援標準的SQL語句,然而也有一些特定於資料庫的SQL語句,應用程式配合SQL語句進行資料庫查詢時,若使用到特定於資料庫的SQL語句,程式本身會有相依於特定資料庫的問題。</p> <p>使用Hibernate時,即使您不了解SQL的使用與撰寫,也可以使用它所提供的API來進行SQL語句查詢,<strong>org.hibernate.Criteria</strong>對SQL進行封裝,您可以從Java物件的觀點來組合各種查詢條件,由Hibernate自動為您產生SQL語句,而不用特別管理SQL與資料庫相依的問題。</p> <p>以最基本的查詢來說,如果您想要查詢某個物件所對應的資料表中所有的內容,您可以如下進行查詢:</p> <pre> Criteria criteria = session.createCriteria(User.class); List users = criteria.list();

           for(Iterator it = users.iterator(); it.hasNext(); ) {User user = (User) it.next();System.out.println(user.getId() +&quot; \t &quot; + user.getName() +&quot;/&quot; + user.getAge());    } </pre>

<p>Criteria建立後,若不給予任何的條件,預設是查詢物件所對應表格之所有資料,如果您執行以上的程式片段,並於設定檔中設定了了Hibernate的”show_sql”屬性,則可以在主控下看到以下的SQL語句之產生:</p>

<p>Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_</p>

<p><strong>Criteria基本查詢條件設定</strong></p>

<p>org.hibernate.Criteria實際上是個條件附加的容器,如果想要設定查詢條件,則要使用<strong>org.hibernate.criterion.Restrictions</strong>的各種靜態方法傳回<strong>org.hibernate.criterion.Criteria</strong>實例,傳回的每個org.hibernate.criterion.Criteria實例代表著一個條件,您要使用org.hibernate.Criteria的<strong>add()</strong>方法加入這些條件實例,例如查詢”age”大於20且小於40的資料:</p>

<pre> Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt(&quot;age&quot;, new Integer(20))); criteria.add(Restrictions.lt(&quot;age&quot;, new Integer(40))); List users = criteria.list(); for(Iterator it = users.iterator(); it.hasNext(); ) { User user = (User) it.next(); System.out.println(user.getId() + &quot; \t &quot; + user.getName() + &quot;/&quot; + user.getAge()); } </pre>

<p>Restrictions的gt()方法表示大於(great than)的條件,而lt表示小於(less than)的條件,執行以上程式片段,觀察所產生的SQL語句,將使用where與and子句產來完成SQL的條件查詢:</p>

<p>Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age&gt;? and this_.age</p>

<p>使用add()方法加入條件時,<strong>預設是使用and來組合條件</strong>,如果要用or的方式來組合條件,則可以使用Restrictions.or()方法,例如結合age等於(eq)20或(or)age為空(isNull)的條件:</p>

<pre> Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.or( Restrictions.eq(&quot;age&quot;, new Integer(20)), Restrictions.isNull(&quot;age&quot;) )); List users = criteria.list(); </pre>

<p>觀察所產生的SQL語句,將使用where與or子句完成SQL的條件查詢:</p>

<p>Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=? or this_.age is null)</p>

<p>您也可以使用Restrictions.like()方法來進行SQL中like子句的功能,例如查詢”name”中名稱為”just”開頭的資料:</p>

<pre> Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.like(&quot;name&quot;, &quot;just%&quot;)); List users = criteria.list(); </pre>

<p>觀察所產生的SQL語句如下:</p>

<p>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 ?</p>

<p>Restrictions的幾個常用限定查詢方法如下表所示:</p>

<p><strong>方法</strong>

<br /><strong>說明</strong></p>

<p>Restrictions.eq <br />等於</p>

<p>Restrictions.allEq <br />使用Map,使用key/value進行多個等於的比對</p>

<p><a href="http://restrictions.gt/">Restrictions.gt</a>

<br />大於 ></p>

<p><a href="http://restrictions.ge/">Restrictions.ge</a>

<br />大於等於 >=</p>

<p><a href="http://restrictions.lt/">Restrictions.lt</a>

<br />小於 <</p>

<p>Restrictions.le <br />小於等於 &lt;=</p>

<p>Restrictions.between <br />對應SQL的BETWEEN子句</p>

<p>Restrictions.like <br />對應SQL的LIKE子句</p>

<p><a href="http://restrictions.in/">Restrictions.in</a>

<br />對應SQL的in子句</p>

<p>Restrictions.and <br />and關係</p>

<p>Restrictions.or <br />or關係</p>

<p><strong>Criteria進階查詢條件設定</strong></p>

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

<p><strong>排序</strong></p>

<p>您可以使用Criteria進行查詢,並使用<strong>org.hibernate.criterion.Order</strong>對結果進行排序,例如使用Oder.asc(),指定根據”age”由小到大排序(反之則使用desc()):</p>

<pre> Criteria criteria = session.createCriteria(User.class); criteria.addOrder(Order.asc(&quot;age&quot;)); List users = criteria.list(); </pre>

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

<p>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</p>

<p><strong>限定查詢筆數</strong></p>

<p>Criteria的<strong>setMaxResults()</strong>方法可以限定查詢回來的筆數,如果配合<strong>setFirstResult()</strong>設定傳回查詢結果第一筆資料的位置,就可以實現簡單的分頁,例如傳回第51筆之後的50筆資料(如果有的話):</p>

<pre> Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult(51); criteria.setMaxResults(50); List users = criteria.list(); </pre>

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

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

<p><strong>統計動作</strong></p>

<p>您可以對查詢結果進行統計動作,使用<strong>org.hibernate.criterion.Projections</strong>的avg()、rowCount()、count()、max()、min()、 countDistinct()等方法,再搭配Criteria的setProjection()方法加入條件設定,例如對查詢結果的&quot;age&quot;作平均:</p>

<pre> Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.avg(&quot;age&quot;)); List users = criteria.list(); </pre>

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

<p>Hibernate: select avg(this_.age) as y0_ from T_USER this_</p>

<p><strong>分組</strong></p>

<p>還可以配合Projections的groupProperty()來對結果進行分組,例如以&quot;age&quot;進行分組,也就是如果資料中&quot;age&quot;如果有 20、20、25、30,則以下會顯示20、25、30:</p>

<pre> Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.groupProperty(&quot;age&quot;)); List users = criteria.list(); </pre>

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

<p>Hibernate: select this_.age as y0_ from T_USER this_ <strong>group by</strong> this_.age</p>

<p>如果想同時結合統計與分組功能,則可以使用<strong>org.hibernate.criterion.ProjectionList</strong>,例如下面的程式會計算每個年齡各有多少個人:</p>

<pre> ProjectionList projectionList = Projections.projectionList(); projectionList.add(Projections.groupProperty(&quot;age&quot;)); projectionList.add(Projections.rowCount()); Criteria criteria = session.createCriteria(User.class); criteria.setProjection(projectionList); List users = criteria.list(); </pre>

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

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

<p><strong>根據已知物件進行查詢</strong></p>

<p>設定查詢條件並非一定要使用Restrictions,如果屬性條件很多,使用Restrictions也不方便,如果有一個已知的物件,則可以根據這個物件作為查詢的依據,看看是否有屬性與之類似的物件,例如:</p>

<pre> User user = new User(); user.setAge(new Integer(30)); Criteria criteria = session.createCriteria(User.class); criteria.add(Example.create(user)); List users = criteria.list(); </pre>

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

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

<p><strong>設定SQL範本</strong></p>

<p>如果您了解如何撰寫SQL語句,想要設定一些Hibernate產生SQL時的範本,您也可以使用Restrictions的<strong>sqlRestriction()</strong>方法,提供SQL語法範本作限定查詢,例如查詢name以cater開頭的資料:</p>

<pre> Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.sqlRestriction(&quot;{alias}.name LIKE (?)&quot;, &quot;cater%&quot;, Hibernate.STRING)); List users = criteria.list(); </pre>

<p>其中alias將被替換為與User類別相關的名稱,而?將被替換為cater%,也就是第二個參數所提供的值,sqlRestriction()方法第一個參數所設定的是where子句的部份,所以在SQL撰寫時,不必再寫where,觀察所產生的SQL語句,將使用您所設定的SQL範本作為基礎,來完成SQL的條件查詢:</p>

<p>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 (?)</p>

<p>如果有多個查詢條件,例如between子句的查詢,則可以如下:</p>

<pre> Criteria criteria = session.createCriteria(User.class); Integer[] ages = {new Integer(20), new Integer(40)}; Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER}; criteria.add(Restrictions.sqlRestriction(&quot;{alias}.age BETWEEN (?) AND (?)&quot;, ages, types)); List users = criteria.list(); </pre>

<p>觀察所產生的SQL語句如下:</p>

<p>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 (?)</p>

<p><strong>使用DetchedCriteria</strong></p>

<p>Criteria與Session綁定,其生命週期跟隨著Session結束而結束,使用Criteria時進行查詢時,每次都要於執行時期動態建立物件,並加入各種查詢條件,隨著Session的回收,Criteria也跟著回收。</p>

<p>為了能夠重複使用Criteria物件,在Hibernate 3中新增了<strong>org.hibernate.criterion.DetchedCriteria</strong>,您可以先建立DetchedCriteria實例,並加入各種查詢條件,並於需要查詢時再與Session綁定,獲得一個綁定Session的Criteria物件,例如:</p>

<pre> // 先建立DetchedCriteria物件 DetachedCriteria detchedCriteria = DetachedCriteria.forClass(User.class); // 加入查詢條件 detchedCriteria.add(Restrictions.ge(&quot;age&quot;,new Integer(25))); Session session = sessionFactory.openSession(); // 綁定Session並返回一個Criteria實例 Criteria criteria = detchedCriteria.getExecutableCriteria(session); List users = criteria.list(); </pre>

<p><strong>結論</strong></p>

<p>Hibernate的Criteria API可以讓您使用物件的方式,組合出查詢資料庫系統的條件,Hibernate會自動依您所使用的資料庫,動態產生SQL語句,讓您的應用程式在存取資料庫時,不致於因撰寫了特定的SQL而相依於特定的資料庫,如果您的開發人員不熟悉SQL語句的撰寫,也可以試著使用Criteria來解決查詢資料庫的需求。</p>

<p> </p>

<p>原文地址:<a href="http://blog.csdn.net/lanshengsheng2012/article/details/8982922">http://blog.csdn.net/lanshengsheng2012/article/details/8982922</a></p>

转载于:https://my.oschina.net/mosg/blog/152135

Hibernate Criteria 条件查询相关推荐

  1. mongoTemplate的GroupOperation分组查询及Criteria条件查询的使用

    mongoTemplate的GroupOperation分组查询及Criteria条件查询的使用 GroupOperation: //此处类似于SQL中的groupBy,group("&qu ...

  2. Hibernate的条件查询的几种方式

    2019独角兽企业重金招聘Python工程师标准>>> 1. 第一种,用?占位符,如: //登录(用?占位符)public List<UserPO> LoginUser( ...

  3. NHibernate——Criteria条件查询

    条件查询 NHibernate.ICriteria接口表示特定持久类的一个查询.ISession是 ICriteria实例的工厂. 这里以Northwind数据库为示例数据库 示例数据表:Employ ...

  4. 博为峰Java技术文章 ——JavaEE Hibernate HQL条件查询

    2019独角兽企业重金招聘Python工程师标准>>> 博为峰小博老师: 条件查询在实际应用中比较广泛,通常使用条件查询过滤数据库返回的查询数据,因为一个表中的所有数据并不一定对用户 ...

  5. Mybatis中的Criteria条件查询

    Criterion Criterion是最基本,最底层的Where条件,用于字段级的筛选. Criteria Criteria包含一个Cretiron的集合,每一个Criteria对象内包含的Cret ...

  6. Criteria条件查询

    一. 常用查询: 1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is  精确匹配,模糊匹配 使用 regex...) public PageUrl getByUrl(String ...

  7. Hibernate Query数据查询

    2019独角兽企业重金招聘Python工程师标准>>> 主要由三种查询:HQL查询.Criteria条件查询.SQL查询. 以下分别讲解 1. HQL查询 HQL(Hibernate ...

  8. Hibernate Criteria对象详解(条件查询)

    Hibernate Criteria对象详解 2014-9-1 16:21| 发布者: 传智特刊| 查看: 7290| 评论: 0 摘要: Hibernate框架是目前JavaEE软件开发的企业主流框 ...

  9. hibernate的查询条件lt_hibernate的多条件查询——Criteria Query的应用

    查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中.此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询条 ...

  10. hibernate Criteria(条件查询接口)

    Criteria(条件查询接口) // 1.简单查询 List<Customer> list = session.createCriteria(Customer.class).list() ...

最新文章

  1. span 标记 width 设置
  2. word转换成pdf java代码_java代码实现word转换成pdf
  3. Java工作笔记-Spring Boot上传图片并显示
  4. intellij Find Usage 查找符号使用快捷键alt + f7在ubuntu下无法使用的解决方法
  5. 计算机参观企业心得,走进联想 感悟联想——北航MBA参观联想集团总部
  6. 如何使用iMazing为iPad创建配置文件
  7. 计算机无纸化考试合卷答题笔记卡,中级会计职称无纸化答题技巧
  8. 定制WES7紧急修复U盘
  9. 路由器能连接到电视上看电视吗?
  10. 家庭无线网络桥接扩展方案
  11. ‘com.cloudera.server.cmf.TrialState‘:Cannot resolve reference to bean ‘entityManagerFactoryBean‘
  12. php json接口转化为数组 生成xml接口
  13. vim 基本够用的操作命令
  14. 我的世界个人服务器搭建
  15. 人工智能入门书单(附PDF链接)
  16. 计算机网络复习记录 (2)Chap 4
  17. 梯度下降法实战案例(波士顿房价)
  18. 浅谈Everdroid流程化机器人设计器
  19. mysql死锁分析工具show engine innodb status
  20. 首创!用户级权限进程防杀 C++

热门文章

  1. js 正则 exec() 和 match() 数据抽取
  2. 不忘初心,不负韶华——2021年中会议发言之一
  3. E: 错误,pkgProblemResolver::Resolve 发生故障,这可能是有软件包被要求保持现状的缘故
  4. 把几个任务分配到几个设备上的代码
  5. Strategy(策略模式)
  6. linux自动化设备,为变电站自动化设备定制Linux系统
  7. valgrind 内存泄露检测
  8. ImportError: cannot import name 'imresize'
  9. oracle中存储函数,oracle中存储函数与存储过程的区别介绍
  10. 已经围上为何不算目_万达为何至今不上市,并非王健林真的钱多,许家印的境遇说明一切...