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後才有的)。