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