一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java的Hibernate框架中Criteria查詢使用的實(shí)例講解

Java的Hibernate框架中Criteria查詢使用的實(shí)例講解

2020-03-20 13:31cxshun JAVA教程

這篇文章主要介紹了Java的Hibernate框架中Criteria查詢使用的實(shí)例講解,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下

我們講一下Criteria查詢,這個(gè)對(duì)于不是太熟悉SQL語(yǔ)句的我們這些程序員來(lái)說(shuō)是很容易上手的。
 廢話不多說(shuō),看一下例子:
 實(shí)體類如下:

?
1
2
3
4
5
6
7
8
public class User implements Serializable{
 
  private static final long serialVersionUID = 1L;
  public Long id;
  private String name;
  private int age;
    //省略Get/Set方法
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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();
}

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

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

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

?
1
select * from user where name='shun'

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

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

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

?
1
org.hibernate.SessionException: Session is closed!

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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)閉之后,我們?cè)诹硗庖粋€(gè)連接中還是可以繼續(xù)用DetachedCriteria。我們需要通過getExecutableCriteria(Session session)把當(dāng)前的DetachedCriteria跟某一個(gè)Session進(jìn)行關(guān)聯(lián)。
 
 
 接下來(lái)我們?cè)賮?lái)看一下Subqueries類與DetachedCriteria的結(jié)合使用:
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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();
     
  }

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

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

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

下面我們來(lái)了解一下它的稍微高級(jí)點(diǎn)的用法。
 直接看代碼吧:

?
1
2
criteria.setFirstResult(10);
criteria.setMaxResults(20);

  這里我們?cè)O(shè)置了開始的記錄是第10條,然后從第10條開始查出20條記錄,根據(jù)這個(gè)做法,我們就可以實(shí)現(xiàn)基本的分頁(yè)功能了。
 當(dāng)然,我們?cè)诤芏嗲闆r下都需要排序,criteria也是支持的:

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

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色悠久久久久综合网小说 | 特级非洲黑人一级毛片 | 亚洲免费二区 | 日本mature乱子视频 | 黑人艹逼| 亚洲AV精品一区二区三区不卡 | 关晓彤被草 | 久青草国产97香蕉在线视频 | 亚洲精品在线播放 | 美女扒开腿让男人桶爽免费gif | 国产伊人久久 | 99久久伊人精品波多野结衣 | 三极黄色 | 三级全黄裸体 | www.俺去啦 | 牛牛影院成人免费网页 | 欧美精品v日韩精品v国产精品 | 星星动漫在线观看免费 | futa文| 亚洲国产欧美在线人成aaaa20 | 91精品乱码一区二区三区 | 日本免费不卡在线一区二区三区 | 91啦丨porny丨蝌蚪 | 日本阿v精品视频在线观看 日本xxx片免费高清在线 | 久久足恋网 | 亚洲2023无矿砖码砖区 | 国产无套在线播放 | 日韩一区二区中文字幕 | 国产国拍亚洲精品av | 国产高清在线观看 | 91丝袜足控免费网站xx | 白丝校花被扒开双腿喷水小说 | 小早川怜子息梦精在线播放 | 猫扑俩性 | spank日本网站脱裤子打屁股 | 精品综合久久久久久8888 | 91色在线观看国产 | 日韩大片在线 | 99视频一区 | 牛牛影院成人免费网页 | 亚洲无人区乱码中文字幕 |