程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java的Hibernate框架中Criteria查詢應用的實例講授

Java的Hibernate框架中Criteria查詢應用的實例講授

編輯:關於JAVA

Java的Hibernate框架中Criteria查詢應用的實例講授。本站提示廣大學習愛好者:(Java的Hibernate框架中Criteria查詢應用的實例講授)文章只能為提供參考,不一定能成為您想要的結果。以下是Java的Hibernate框架中Criteria查詢應用的實例講授正文


我們講一下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來停止查詢:
 

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(); 
} 

  看到代碼,很簡略的一串。
 後面都很熟習啦,我們看到結構session以後的代碼:
 

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

  這兩句代碼是重點,我們來剖析一下,畢竟是甚麼意思?
 第一句我們經由過程session獲得Criteria完成類的一個對象,接著第二句我們經由過程add辦法添加一個前提,eq表現相等。在Hibernate3之前是經由過程Expression.eq來完成,3以後因為Criteria被擯棄,我們改用Restrictions類來完成,它和Expression一樣的用法。我們看看API發明Expression繼續於Restrictions。
 回到我們下面的兩句,我們做完這些任務後,現實上hibernate幫我們結構了相似

 select * from user where name='shun' 

  如許的語句。(這裡我們映照文件中User類對應的表是user表,而name屬性對應的是name字段)
 
 Restrictions還有很多贊助我們結構SQL語句的辦法,年夜家查一下API很輕易便可以懂得了。
 
 我們從新看一下下面的代碼,假如我們封閉了session,然則我們想持續應用這個criteria,行嗎?我們來看一下。
 在下面的代碼以後,我們從新遍歷,加上:
 

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

  為了辨別跟上一個list和iter的差別,我們這裡用別的一個。
 運轉它,我們獲得的是一個異常:
 

org.hibernate.SessionException: Session is closed! 

  報這個異常表現session曾經封閉,許多情形下我們在封閉了session再停止saveOrUpdate,save等跟耐久化相干的操作都邑報相似的異常。
 Hibernate3斟酌到了我們這個需求,它完成了一個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封閉以後,我們在別的一個銜接中照樣可以持續用DetachedCriteria。我們須要經由過程getExecutableCriteria(Session session)把以後的DetachedCriteria跟某一個Session停止聯系關系。
 
 
 接上去我們再來看一下Subqueries類與DetachedCriteria的聯合應用:
 

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(); 
     
  } 

  估量年夜家有疑問的應當是第一句代碼:
 

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

  這句代碼是指經由過程decriteria獲得age的均勻值。然後鄙人面獲得年夜於均勻值的age的對象。
 Projections包括了很多完成SQL辦法的封裝辦法,年夜家可以看一下API。

上面我們來懂得一下它的略微高等點的用法。
 直接看代碼吧:

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

  這裡我們設置了開端的記載是第10條,然後從第10條開端查出20筆記錄,依據這個做法,我們便可以完成根本的分頁功效了。
 固然,我們在許多情形下都須要排序,criteria也是支撐的:

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

  這裡,我們直接用addOrder辦法便可,外面經由過程Order.desc獲得一個Order對象,它須要一個屬性參數。現實受騙我們挪用addOrder時,hibernate會幫我們生成order by age,如許的語句。
 
 當我們須要停止分組時,這個怎樣做呢?這個就須要用到我們前次有觸及到的Projections這個類的groupProperty辦法,
 

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

  這裡我們就依據age屬性來停止分組,現實上也就是經由過程age對應的字段age停止分組,hibernate會主動幫我們轉換成group by age如許的語句。
Projections中有很多適用的辦法(留意,此為是hibernate 3後才有的)。  
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved