欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的Hibernate框架中Criteria查詢使用的實例講解

 更新時間:2016年01月04日 08:44:36   作者:cxshun  
這篇文章主要介紹了Java的Hibernate框架中Criteria查詢使用的實例講解,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下

我們講一下Criteria查詢,這個對于不是太熟悉SQL語句的我們這些程序員來說是很容易上手的。
 廢話不多說,看一下例子:
 實體類如下:

public class User implements Serializable{ 
 
  private static final long serialVersionUID = 1L; 
  public Long id; 
  private String name; 
  private int age; 
    //省略Get/Set方法 
} 

  映射文件我們就不寫了,很簡單的一個實體,如果不懂的童鞋請參照我在hibernate分類中的其他文章。
 接下來我們看如何使用Criteria來進(jìn)行查詢:
 

public static void main(String[] args) { 
 
  Configuration cfg = new Configuration().configure(); 
  SessionFactory sessionFactory = cfg.buildSessionFactory(); 
  Session session = sessionFactory.openSession(); 
   
  Criteria criteria = session.createCriteria(User.class); 
  criteria.add(Restrictions.eq("name","shun")); 
   
  List list = criteria.list(); 
  Iterator iter = list.iterator(); 
  while(iter.hasNext()) { 
    User user = (User)iter.next(); 
    System.out.println(user.getName()+":"+user.getAge()); 
  } 
   
  session.close(); 
} 

  看到代碼,很簡單的一串。
 前面都很熟悉啦,我們看到構(gòu)造session之后的代碼:
 

Criteria criteria = session.createCriteria(User.class); 
criteria.add(Restrictions.eq("name","shun")); 

  這兩句代碼是重點,我們來分析一下,究竟是什么意思?
 第一句我們通過session得到Criteria實現(xiàn)類的一個對象,接著第二句我們通過add方法添加一個條件,eq表示相等。在Hibernate3以前是通過Expression.eq來實現(xiàn),3之后由于Criteria被拋棄,我們改用Restrictions類來實現(xiàn),它和Expression一樣的用法。我們看看API發(fā)現(xiàn)Expression繼承于Restrictions。
 回到我們上面的兩句,我們做完這些工作后,實際上hibernate幫我們構(gòu)造了類似

 select * from user where name='shun' 

  這樣的語句。(這里我們映射文件中User類對應(yīng)的表是user表,而name屬性對應(yīng)的是name字段)
 
 Restrictions還有許多幫助我們構(gòu)造SQL語句的方法,大家查一下API很容易就可以理解了。
 
 我們重新看一下上面的代碼,如果我們關(guān)閉了session,但是我們想繼續(xù)使用這個criteria,行嗎?我們來看一下。
 在上面的代碼之后,我們重新遍歷,加上:
 

List list2 = criteria.list(); 
Iterator iter2 = list.iterator(); 
while(iter.hasNext()) { 
  User user = (User)iter.next(); 
  System.out.println(user.getName()+":"+user.getAge()); 
} 

  為了區(qū)分跟上一個list和iter的區(qū)別,我們這里用另外一個。
 運行它,我們得到的是一個異常:
 

org.hibernate.SessionException: Session is closed! 

  報這個異常表示session已經(jīng)關(guān)閉,很多情況下我們在關(guān)閉了session再進(jìn)行saveOrUpdate,save等跟持久化相關(guān)的操作都會報類似的異常。
 Hibernate3考慮到了我們這個需求,它實現(xiàn)了一個DetachedCriteria,這個可以獨立于Session而存在。
 我們來看一下例子:(實體還是上面的)
 

public static void main(String[] args) { 
     
    Configuration cfg = new Configuration().configure(); 
    SessionFactory sessionFactory = cfg.buildSessionFactory(); 
    Session session = sessionFactory.openSession(); 
     
    DetachedCriteria decriteria = DetachedCriteria.forClass(User.class); 
    decriteria.add(Restrictions.eq("name","shun")); 
     
    List list = decriteria.getExecutableCriteria(session).list(); 
    Iterator iter = list.iterator(); 
    while(iter.hasNext()) { 
      User user = (User)iter.next(); 
      System.out.println(user.getName()+":"+user.getAge()); 
    } 
     
    session.close(); 
     
    Session session2 = sessionFactory.openSession(); 
    List list2 = decriteria.getExecutableCriteria(session2).list(); 
    Iterator iter2 = list2.iterator(); 
    while(iter2.hasNext()) { 
      User user = (User)iter2.next(); 
      System.out.println(user.getName()+":"+user.getAge()); 
    } 
  } 

  我們看到在session關(guān)閉之后,我們在另外一個連接中還是可以繼續(xù)用DetachedCriteria。我們需要通過getExecutableCriteria(Session session)把當(dāng)前的DetachedCriteria跟某一個Session進(jìn)行關(guān)聯(lián)。
 
 
 接下來我們再來看一下Subqueries類與DetachedCriteria的結(jié)合使用:
 

public static void main(String[] args) { 
     
    Configuration cfg = new Configuration().configure(); 
    SessionFactory sessionFactory = cfg.buildSessionFactory(); 
    Session session = sessionFactory.openSession(); 
     
    DetachedCriteria decriteria = DetachedCriteria.forClass(User.class); 
    decriteria.setProjection(Projections.avg("age")); 
     
    Criteria criteria = session.createCriteria(User.class); 
    criteria.add(Subqueries.propertyGt("age",decriteria)); 
    List list = criteria.list(); 
    Iterator iter = list.iterator(); 
    while(iter.hasNext()) { 
      User user = (User)iter.next(); 
      System.out.println(user.getName()+":"+user.getAge()); 
    } 
     
    session.close(); 
     
  } 

  估計大家有疑問的應(yīng)該是第一句代碼:
 

decriteria.setProjection(Projections.avg("age")); 

  這句代碼是指通過decriteria得到age的平均值。然后在下面取得大于平均值的age的對象。
 Projections包含了許多實現(xiàn)SQL方法的封裝方法,大家可以看一下API。

下面我們來了解一下它的稍微高級點的用法。
 直接看代碼吧:

criteria.setFirstResult(10); 
criteria.setMaxResults(20); 

  這里我們設(shè)置了開始的記錄是第10條,然后從第10條開始查出20條記錄,根據(jù)這個做法,我們就可以實現(xiàn)基本的分頁功能了。
 當(dāng)然,我們在很多情況下都需要排序,criteria也是支持的:

 criteria.addOrder(Order.desc("age")); 

  這里,我們直接用addOrder方法即可,里面通過Order.desc得到一個Order對象,它需要一個屬性參數(shù)。實際上當(dāng)我們調(diào)用addOrder時,hibernate會幫我們生成order by age,這樣的語句。
 
 當(dāng)我們需要進(jìn)行分組時,這個怎么做呢?這個就需要用到我們上次有涉及到的Projections這個類的groupProperty方法,
 

criteria.setProjection(Projections.groupProperty("age")); 

  這里我們就根據(jù)age屬性來進(jìn)行分組,實際上也就是通過age對應(yīng)的字段age進(jìn)行分組,hibernate會自動幫我們轉(zhuǎn)換成group by age這樣的語句。
Projections中有許多實用的方法(注意,此為是hibernate 3后才有的)。  
 

相關(guān)文章

  • java中replaceAll替換圓括號實例代碼

    java中replaceAll替換圓括號實例代碼

    正則表達(dá)式的保留字符主要有:圓括號、方括號、花括號、豎線、橫線、點號、加號、星號、反斜桿等等,下面這篇文章主要給大家介紹了關(guān)于java中replaceAll替換圓括號的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 簡述Mybatis增刪改查實例代碼

    簡述Mybatis增刪改查實例代碼

    本文給大家分享編寫一個簡單的mybatis進(jìn)行插入數(shù)據(jù)的實例代碼,非常不錯具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-10-10
  • java web開發(fā)中大量數(shù)據(jù)導(dǎo)出Excel超時(504)問題解決

    java web開發(fā)中大量數(shù)據(jù)導(dǎo)出Excel超時(504)問題解決

    開發(fā)測試時候?qū)霐?shù)據(jù)遇到大數(shù)據(jù)導(dǎo)入的問題,整理了下,需要的朋友可以參考下
    2017-04-04
  • Java實現(xiàn)簡單的迷宮游戲詳解

    Java實現(xiàn)簡單的迷宮游戲詳解

    迷宮游戲作為經(jīng)典的小游戲,一直深受大家的喜愛。本文小編將為大家詳細(xì)介紹一下如何用Java實現(xiàn)一個簡單的迷宮小游戲,感興趣的可以動手試一試
    2022-02-02
  • 圖解紅黑樹及Java進(jìn)行紅黑二叉樹遍歷的方法

    圖解紅黑樹及Java進(jìn)行紅黑二叉樹遍歷的方法

    紅黑樹問題是各大計算機(jī)考研命題以及面試算法題目中的熱門,接下來我們?yōu)榇蠹覉D解紅黑樹及Java進(jìn)行紅黑二叉樹遍歷的方法,需要的朋友可以參考下
    2016-05-05
  • java中-jar 與nohup的對比

    java中-jar 與nohup的對比

    這篇文章主要介紹了java中 -jar 與nohup的對比的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • skywalking分布式服務(wù)調(diào)用鏈路追蹤APM應(yīng)用監(jiān)控

    skywalking分布式服務(wù)調(diào)用鏈路追蹤APM應(yīng)用監(jiān)控

    這篇文章主要為大家介紹了skywalking分布式服務(wù)調(diào)用鏈路追蹤APM應(yīng)用監(jiān)控的功能使用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • java實現(xiàn)一致性hash算法實例代碼

    java實現(xiàn)一致性hash算法實例代碼

    這篇文章主要給大家介紹了關(guān)于java實現(xiàn)一致性hash算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)之線段樹中的懶操作詳解

    Java數(shù)據(jù)結(jié)構(gòu)之線段樹中的懶操作詳解

    對于線段樹,若要求對區(qū)間中的所有點都進(jìn)行更新,可以引入懶操作。懶操作包括區(qū)間更新和區(qū)間查詢操作。本文將通過一個示例和大家詳細(xì)聊聊線段樹中的懶操作,需要的可以參考一下
    2022-10-10
  • java觀察者模式實現(xiàn)和java觀察者模式演化

    java觀察者模式實現(xiàn)和java觀察者模式演化

    觀察者模式是經(jīng)典設(shè)計模式中很常用的一種,平常我們看到的監(jiān)聽器,基本上都是采用這種設(shè)計模式實現(xiàn)的,這里探討一下觀察者模式的演化
    2014-02-02

最新評論