亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Hibernate之criteria查詢

2019-11-15 01:07:44
字體:
來源:轉載
供稿:網友
Hibernate之criteria查詢

  以前寫hibernate查詢的時候都是萬年不變的HQL語句查詢,實在不行的就返璞歸真進行SQL查詢,這兩天寫代碼的時候見到了criteria的查詢方式,覺得挺好使,就在網上查查資料,項目里面的功能是完成了,但是對這個criteria的使用還是不是很熟練,建個小工程搭個hibernate,一邊看資料一邊做測試順便寫個博客記錄一下,一舉三得有木有。

  Hibernate 定義了Criteriaspecification接口規范用來完成面向對象的條件查詢,Criteria 就是CriteriaSpecification的子接口。使用criteria時,你不需要去關心SQL語句,我想這對于SQL語句不太好的人來說是個最大的好處,好了廢話不多說,下面進入主題。

  1、創建Criteria

  Criteria的實現是離不開session的,也就是說Criteria的生命周期隨著session的生命周期的結束而結束,在使用Criteria進行查詢的時候,每次都要在執行時期動態建立物件,并且加入各種查詢條件,如果session回收了,那么Criteria也跟著回收。

  Criteria的創建如下:

Criteria criteria =  session.createCriteria(User1.class);

User1.class表示你要查詢的那個實體類。

  2、Criteria查詢2.1
@Test    public void test() {            Criteria criteria =  session.createCriteria(User1.class);        List<User1> list = criteria.list();        for(User1 u: list){        System.out.PRintln(u.toString());    }            }

上述的方式就是Criteria的查詢方式,創建好Criteria之后,只要使用Criteria.list()方法即可查詢到你要查詢的實體的數據集合,可以看一下hibernate發出的sql語句:

Hibernate: select this_.uid as uid0_0_, this_.username as username0_0_, this_.pwd as pwd0_0_, this_.create_date as create4_0_0_ from test.t_user1 this_

這個跟我們寫HQL語句查詢時hibernate發出的sql語句是一樣。

2.2

  但是上面的查詢是對查詢出了全部的數據,有時候這并不是我們想要的,比如說我現在想查出姓張的用戶?這時候就需要使用Criteria方式添加條件了,先看一個代碼演示:

@Test    public void test() {            Criteria criteria =  session.createCriteria(User1.class);        criteria.add(Restrictions.like("name", "%張%"));        List<User1> list = criteria.list();        for(User1 u: list){        System.out.println(u.toString());    }            }

  此時的查詢結果就是名字中帶有張字的用戶,上面說的姓張的用戶并不準確,這就是一個模糊查詢,like像的意思,也就是說在告訴criteria在查詢的時候給我找出來名字帶張字的,看我不揍死他們,就這意思。

此時控制臺發出的sql語句如下:

Hibernate: select this_.uid as uid0_0_, this_.username as username0_0_, this_.pwd as pwd0_0_, this_.create_date as create4_0_0_ from test.t_user1 this_ where this_.username like ?

要注意的地方有幾個:第一,like后面的兩個參數,第一個參數是實體類中對應的要查詢的字段,第二個參數是查詢的條件。

          第二,模糊查詢可以用like,但是等于查詢就是eq、大于等于是ge、between表示兩者之間等等,這個在使用的時候需要注意一下,不同的查詢使用不同的可以叫做方法吧。

          第三,添加條件的時候都是使用的criteria.add(),這個方法是沒有什么變化的。

          第四,Restrictions是一個工具類,提供了大量的靜態方法,比如上面的like(),eq()等。

2.3

上面的查詢條件是只有一個,那如果現在我有多個查詢條件怎么辦呢?這個也好辦,使用多個criteria.add()方法來滿足多條件的查詢,并且這多個條件之間屬于and的關系,如下所示:

@Test    public void test() {            Criteria criteria =  session.createCriteria(User1.class);        criteria.add(Restrictions.like("name", "%張%"));    criteria.add(Restrictions.eq("passWord", "123"));        List<User1> list = criteria.list();        for(User1 u: list){        System.out.println(u.toString());    }            }

上面的查詢什么意思呢?意思就是在查找名字中帶有張字的同時還要滿足密碼是123的,兩個條件之間屬于并列關系,可以看一下hibernate發出的查詢語句:

Hibernate: select this_.uid as uid0_0_, this_.username as username0_0_, this_.pwd as pwd0_0_, this_.create_date as create4_0_0_ from test.t_user1 this_ where this_.username like ? and this_.pwd=?

2.4

  現在需求又變了,怎么變了呢?我現在不查名字里面帶張字的了,我現在知道倆密碼,一個123,一個234,就查密碼是123或者234的用戶,這時候怎么查???倆條件我寫倆criteria.add()方法嗎?但是這倆是屬于and關系啊,怎么搞?看下面的代碼:

@Test    public void test() {            Criteria criteria =  session.createCriteria(User1.class);        //criteria.add(Restrictions.like("name", "%張%"));    //criteria.add(Restrictions.eq("password", "123"));        criteria.add(Restrictions.or(            Restrictions.eq("password", "123"),             Restrictions.eq("password", "234")));        List<User1> list = criteria.list();        for(User1 u: list){        System.out.println(u.toString());    }            }

再看一下hibernate發出的sql語句:

Hibernate: select this_.uid as uid0_0_, this_.username as username0_0_, this_.pwd as pwd0_0_, this_.create_date as create4_0_0_ from test.t_user1 this_ where (this_.pwd=? or this_.pwd=?)

可以看到sql語句最后是pwd=? or pwd = ?,進行的是或查詢,怎么實現的呢?就是Restrictions.or()方法,表示或的意思,里面的兩個參數又是兩個表達式,between操作與or操作差不多,大家試一下就會了,我就不再廢話了。

2.5

列一下常用的常用的幾個Restrictions方法:

  Restrictions.eq 等于  Restrictions.allEq 使用Map,使用key/value進行多個等于的比對  Restrictions.gt 大于 >  Restrictions.ge 大于等于 >=  Restrictions.lt 小于 <  Restrictions.le 小于等于 <=  Restrictions.between 對應SQL的BETWEEN子句  Restrictions.like 對應SQL的LIKE子句  Restrictions.in 對應SQL的in子句  Restrictions.and and關系  Restrictions.or or關系

3.criteria 排序、統計、分組等功能3.1 排序

在使用criteria查詢結果集的時候是可以對所查詢的數據進行排序的,怎么做呢?看下面:

@Test    public void test() {            Criteria criteria =  session.createCriteria(User1.class);        criteria.addOrder(Order.asc("name"));        List<User1> list = criteria.list();        for(User1 u: list){        System.out.println(u.toString());    }            }

hibernate發出的sql語句:

Hibernate: select this_.uid as uid0_0_, this_.username as username0_0_, this_.pwd as pwd0_0_, this_.create_date as create4_0_0_ from test.t_user1 this_ order by this_.username asc

可以看到是根據用戶名進行正序排序,如果是倒序排列呢,只需要把asc換成desc就可以了,就是這么任性,但是要注意,此時添加的排序條件是使用的是criteria.addOrder()方法,而不是criteria.add().

3.2 偽分頁

  為什么叫偽分頁呢,我這里就是做一個簡單的演示操作,跟分頁扯不上什么關系,只不過查詢方法類似于分頁的查詢方法而已,所以我起名叫偽分頁,不過這個應該有具體的名字吧,不過我也不知道到底叫什么,就隨便叫吧,大家看了代碼就知道我說的是什么了。

@Test    public void test() {            Criteria criteria =  session.createCriteria(User1.class);        //criteria.addOrder(Order.asc("name"));    criteria.setFirstResult(1);    criteria.setMaxResults(3);        List<User1> list = criteria.list();        for(User1 u: list){        System.out.println(u.toString());    }            }

上sql語句:

Hibernate: select this_.uid as uid0_0_, this_.username as username0_0_, this_.pwd as pwd0_0_, this_.create_date as create4_0_0_ from test.t_user1 this_ limit ?, ?

看了上面的代碼大家有沒有覺得跟寫分頁時候的從第幾條記錄開始,每次顯示多少條記錄很像。

    今天有事,先總結到這,下次再繼續總結。

  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品综合视频| 精品中文字幕视频| 亚洲男人天堂手机在线| 91色p视频在线| 国产精品三级美女白浆呻吟| 久久精品中文字幕| 青青草原成人在线视频| 欧美中文在线视频| 久久久久久久久久久久久久久久久久av| 成人av资源在线播放| yw.139尤物在线精品视频| 夜夜嗨av一区二区三区免费区| 亚洲欧美激情在线视频| 91欧美激情另类亚洲| 亚洲第一av在线| 色妞在线综合亚洲欧美| 国产成人精品最新| 国产suv精品一区二区三区88区| 国产精品亚洲一区二区三区| 欧美精品一区三区| 亚洲欧美在线看| 国模叶桐国产精品一区| 亚洲激情在线观看| 国产九九精品视频| 国产精品专区h在线观看| 日韩在线视频网| 国产精品爽爽ⅴa在线观看| 黑人巨大精品欧美一区二区三区| 亚洲2020天天堂在线观看| 中文字幕亚洲激情| 亚洲国产中文字幕在线观看| 怡红院精品视频| 精品中文字幕久久久久久| 日韩欧美中文字幕在线播放| 精品一区二区三区四区| 日韩精品免费视频| 亚洲国产精品久久精品怡红院| 成人午夜在线视频一区| 亚洲国产成人精品久久| 琪琪第一精品导航| 国产精品一区二区久久国产| 岛国精品视频在线播放| 国产精品极品美女粉嫩高清在线| 91tv亚洲精品香蕉国产一区7ujn| 中文字幕免费精品一区| 国产日韩欧美中文在线播放| 亚洲成人av在线播放| 欧洲日韩成人av| 国产综合久久久久久| 亚洲欧洲一区二区三区在线观看| 欧美日韩国产区| 成人美女av在线直播| 日韩在线观看免费高清| 91精品国产成人www| 久久五月天色综合| 欧美在线免费观看| 欧美日韩国产一区在线| 色偷偷91综合久久噜噜| 亚洲另类图片色| 日韩在线播放av| 在线观看免费高清视频97| 成人黄色av播放免费| 国产精品久久久久99| 欧美日韩中文在线| 日韩中文视频免费在线观看| 国产精品日韩一区| 欧美日韩久久久久| 91亚洲国产成人精品性色| 91免费国产视频| 亚洲第一精品夜夜躁人人爽| 亚洲图片欧洲图片av| 久久免费视频这里只有精品| 亚洲国产女人aaa毛片在线| 精品综合久久久久久97| 久久综合色影院| 国产精品露脸自拍| 日韩高清a**址| 国产精品欧美日韩久久| 亚洲国产第一页| 欧美性猛交xxx| 久久男人资源视频| 成人免费淫片视频软件| 亚洲国产精品成人一区二区| 久久999免费视频| 国产精品入口夜色视频大尺度| 成人午夜一级二级三级| 夜夜躁日日躁狠狠久久88av| 国产精品嫩草影院久久久| 国产一区二区黄| 麻豆国产va免费精品高清在线| 国产精品美女在线| 亚洲人成欧美中文字幕| 国产日韩欧美视频| 欧美裸体男粗大视频在线观看| 欧美成人精品一区二区三区| 国产aaa精品| 国产亚洲欧美另类中文| 日韩电影大全免费观看2023年上| 亚洲精品黄网在线观看| 色偷偷偷综合中文字幕;dd| 日韩高清人体午夜| 久久精品视频va| 91精品久久久久久久久| 国产精品一久久香蕉国产线看观看| 久久视频在线看| 欧美最顶级丰满的aⅴ艳星| 国产精品视频自在线| 日韩视频―中文字幕| 亚洲在线免费看| 91精品国产91久久久久久吃药| 国产福利成人在线| 91在线高清免费观看| 亚洲自拍偷拍区| 91中文精品字幕在线视频| 日韩女优人人人人射在线视频| 欧美裸体男粗大视频在线观看| 日韩中文字幕在线播放| 最新国产精品拍自在线播放| 久久久97精品| 久久视频免费观看| 久久亚洲国产精品成人av秋霞| 久久99久久99精品中文字幕| 国产欧美久久一区二区| 亚洲欧美日韩中文在线| 九九热99久久久国产盗摄| 在线一区二区日韩| 91视频国产精品| 亚洲国产日韩欧美综合久久| 亚洲欧美日韩天堂一区二区| 91系列在线播放| 亚洲自拍另类欧美丝袜| 亚洲福利小视频| 久久福利视频导航| 国语自产偷拍精品视频偷| 日韩成人小视频| 91最新在线免费观看| 国产美女扒开尿口久久久| 欧美精品videos性欧美| 亚洲天堂av网| 97久久精品人搡人人玩| 成人国产精品av| 亚洲精品国精品久久99热一| 日韩欧美大尺度| 日韩av在线免费观看| 亚洲国产另类 国产精品国产免费| 不卡av日日日| 亚洲美腿欧美激情另类| 亚洲影院色无极综合| 欧美在线影院在线视频| 国产精品欧美日韩一区二区| 国产精品一二三视频| 亚洲电影免费观看高清完整版| 中文字幕久热精品视频在线| 亚洲日韩中文字幕在线播放| 欧美日韩国产成人在线观看| 日本午夜在线亚洲.国产| 色婷婷av一区二区三区在线观看| 午夜精品国产精品大乳美女| 日韩在线观看免费全| 国产精品综合不卡av| 亚洲精品美女在线观看| 91久久精品一区| 亚洲免费一级电影| 亚洲第一视频网|