欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

DetachedCriteria與Criteria的用方有哪些不同

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)DetachedCriteria與Criteria的用方有哪些不同,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

目前累計服務(wù)客戶成百上千家,積累了豐富的產(chǎn)品開發(fā)及服務(wù)經(jīng)驗。以網(wǎng)站設(shè)計水平和技術(shù)實力,樹立企業(yè)形象,為客戶提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計、網(wǎng)絡(luò)營銷、VI設(shè)計、網(wǎng)站改版、漏洞修補等服務(wù)。成都創(chuàng)新互聯(lián)始終以務(wù)實、誠信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過對領(lǐng)先技術(shù)的掌握、對創(chuàng)意設(shè)計的研究、對客戶形象的視覺傳遞、對應用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進步。

在常規(guī)的Web編程中,有大量的動態(tài)條件查詢,即用戶在網(wǎng)頁上面自由選擇某些條件,程序根據(jù)用戶的選擇條件,動態(tài)生成SQL語句,進行查詢。

比如,我記得在Facebook中可以選擇高級查詢條件,這個就是個動態(tài)的查詢了塞,我們無法預知使用多少個查詢,直接書寫死了在我們的Dao層顯然是不服和我們的意思的塞

針對這種需求,對于分層應用程序來說,Web層需要傳遞一個查詢的條件列表給業(yè)務(wù)層對象,業(yè)務(wù)層對象獲得這個條件列表之后,然后依次取出條件,構(gòu)造查詢語句。這里的一個難點是條件列表用什么來構(gòu)造?傳統(tǒng)上使用Map,但是這種方式缺陷很大,Map可以傳遞的信息非常有限,只能傳遞name和value,無法傳遞究竟要做怎樣的條件運算,究竟是大于,小于,like,還是其它的什么,業(yè)務(wù)層對象必須確切掌握每條entry的隱含條件。因此一旦隱含條件改變,業(yè)務(wù)層對象的查詢構(gòu)造算法必須相應修改,但是這種查詢條件的改變是隱式約定的,而不是程序代碼約束的,因此非常容易出錯。

DetachedCriteria可以解決這個問題,即在web層,程序員使用DetachedCriteria來構(gòu)造查詢條件,然后將這個 DetachedCriteria作為方法調(diào)用參數(shù)傳遞給業(yè)務(wù)層對象。而業(yè)務(wù)層對象獲得DetachedCriteria之后,可以在session范圍內(nèi)直接構(gòu)造Criteria,進行查詢。就此,查詢語句的構(gòu)造完全被搬離到web層實現(xiàn),而業(yè)務(wù)層則只負責完成持久化和查詢的封裝即可,與查詢條件構(gòu)造完全解耦,非常完美!

Criteria 和 DetachedCriteria 的主要區(qū)別

在于創(chuàng)建的形式不一樣, Criteria 是在線的,所以它是由 Hibernate Session 進行創(chuàng)建的,而 DetachedCriteria 是離線的,創(chuàng)建時無需Session .

DetachedCriteria的創(chuàng)建

DetachedCriteria 提供了 2 個靜態(tài)方法 ,進行DetachedCriteria 實例的創(chuàng)建。
forClass(Class)
forEntityName(Name)

Spring 的框架提供了對于離線查詢的支持,非常的簡單的使用那些方法

Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根據(jù)DetachedCriteria 來返回查詢結(jié)果。Criteria的子類就是 DetachedCriteria 我們可以簡單的使用就好了。

使用到了這些我們就不得不說 Restrictions

是產(chǎn)生查詢條件的工具類。Restrictions表達式如下
HQL運算符 QBC運算符 含義
= Restrictions.eq() 等于equal
<> Restrictions.ne() 不等于 not equal

 Restrictions.gt() 大于greater than 
= Restrictions.ge() 大于等于 greater than or equal 
< Restrictions.lt() 小于less than 
<= Restrictions.le() 小 于 等 于 less than or equal 
is null Restrictions.isnull() 等于空值 
is not null Restrictions.isNotNull() 非空值 
like Restrictions.like() 字符串模式匹配 
and Restrictions.and() 邏輯與 
and Restrictions.conjunction() 邏輯與 
or Restrictions.or() 邏輯或 
or Restrictions.disjunction() 邏輯或 
not Restrictions.not() 邏輯非 
in(列表) Restrictions.in() 等于列表中的某一個值 
not in(列表) Restrictions.not(Restrictions.in()) 不等于列表中任意一個值 
between x and y Restrictions.between() 閉區(qū)間 xy中的任意值 
not between x and y Restrictions.not(Restrictions..between()) 小于值X 或者大于值y

Criteria 這個也是必須說的東西嘛,翻譯過來就是條件,標準之類的意思!和我們的離線的差不都

那么我們看看例子吧

查User表格中的所有資料

我們這個需要獲取到我們的session對象哦~~線上的查詢,和我們的Query類似的,但是更強大哦!

 Criteria criteria = session.createCriteria(User.class);
 List users = criteria.list();
 Iterator iterator = users.iterator();
 while(iterator.hasNext()) {
  User user = (User) iterator.next();
  System.out.println(user.getId() + user.getName());   
 }

Criteria只是個容器,如果想要設(shè)定查詢條件,只要使用add()方法加入Restrictions的條件限制,例如查詢age大大于20且小于40的資料。雖然我們的SQL語句也是可以完成的,但是為了更好的封裝,更多的復用代碼,最好還是不要直接的書寫我們的SQL語句,看到了公司封裝的代碼,才感覺到前輩的強大無比,復用代碼的靈活性非常的高! 這里,我們可以傳遞無限制的Restrictions進行封裝起來,非常方便的使用!

Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.gt("age", new Integer(20)));
criteria.add(Restrictions.lt("age", new Integer(40)));
List users = criteria.list();

您也可以使用邏輯組合來進行查詢,例如結(jié)合age等于(eq)20或(or)age為空(isNull)的條件:

一個單獨的查詢條件是org.hibernate.criterion.Criterion 接口的一個實例。
org.hibernate.criterion.Restrictions類 定義了獲得某些內(nèi)置Criterion類型的工廠方法。

List cats = sess.createCriteria(Cat.class)

 .add( Restrictions.like("name", "Fritz%") )

 .add( Restrictions.between("weight", minWeight, maxWeight) )

 .list();

動態(tài)關(guān)聯(lián)抓取

我們的抓取模式,對于1對多的關(guān)聯(lián)的形式!是不是抓取過來呢?

你可以使用setFetchMode()在運行時定義動態(tài)關(guān)聯(lián)抓取的語義

List cats = sess.createCriteria(Cat.class)

.add( Restrictions.like("name", "Fritz%") )

.setFetchMode("mate", FetchMode.EAGER)

.setFetchMode("kittens", FetchMode.EAGER)

.list();

這個查詢可以通過外連接抓取mate和kittens。

DetachedCriteria的關(guān)聯(lián)查詢

假設(shè)要通過stuName查詢一個學生Student記錄,可以如下:

DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
dc.add(Restrictions.like("stuName", stuName, MatchMode.ANYWHERE)); 

如果要通過Student的Team的teamName查詢一個Student記錄,很多人都會這么寫:

DetachedCriteria dc = DetachedCriteria.forClass(Student.class); 
dc.add(Restrictions.like("team.teamName", teamName, MatchMode.ANYWHERE)); 


遺憾的是上述程序報錯,說是在Student中找不到team.teamName屬性,這是可以理解的。那么如何通過teamName查找、、Student呢?

可以這么寫:

DetachedCriteria dc = DetachedCriteria.forClass(Student.class); 
dc.createAlias("team", "t"); 
dc.add(Restrictions.like("t.teamName", teamName, MatchMode.ANYWHERE)); 

沒錯,就是要先建立team的引用,才能用team導航到teamName

Department和Employee是一對多關(guān)聯(lián),查詢條件為: 名稱是“department”開發(fā)部門,部門里面的雇員年齡大于20歲;

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.add(Restrictions.eq("name", "department"))
     .createAlias("employees", "e")
     .add(Restrictions.gt(("e.age"), new Integer(20)));
List list = this.getHibernateTemplate().findByCriteria(detachedCriteria);

投影(Projections)、聚合(aggregation)和分組(grouping)

org.hibernate.criterion.Projections是 Projection 的實例工廠。

我們通過調(diào)用setProjection()應用投影到一個查詢。這個的意思就是查詢哪一列的意思

用來進行聚合操作,和sql中的聚合類似.求和/求平均值/統(tǒng)計記錄數(shù)/…等等.

還有用來獲取獲取對象的某些屬性(表字段)或?qū)傩约?正常情況下,查詢返回的是對象或?qū)ο蟮募?使用投影的話就可以只返回你需要的屬性值.即Hibernate不把記錄封裝對象了,只返回你在投影中設(shè)置的屬性的值(值的集合)的數(shù)組

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.rowCount() )

 .add( Restrictions.eq("color", Color.BLACK) )

 .list();
List results = session.createCriteria(Cat.class)

 .setProjection( Projections.projectionList()

  .add( Projections.rowCount() )

  .add( Projections.avg("weight") )

  .add( Projections.max("weight") )

  .add( Projections.groupProperty("color") )

 )

 .list();

在一個條件查詢中沒有必要顯式的使用 “group by” 。某些投影類型就是被定義為 分組投影,他們也出現(xiàn)在SQL的group by子句中。

可以選擇把一個別名指派給一個投影,這樣可以使投影值被約束或排序所引用。下面是兩種不同的

實現(xiàn)方式:

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )

 .addOrder( Order.asc("colr") )

 .list();
List results = session.createCriteria(Cat.class)

 .setProjection( Projections.groupProperty("color").as("colr") )

 .addOrder( Order.asc("colr") )

 .list();

alias()和as()方法簡便的將一個投影實例包裝到另外一個 別名的Projection實例中。簡而言之, 當你添加一個投影到一個投影列表中時 你可以為它指定一個別名:

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.projectionList()//一個查詢只能使用一個投影!這里只能這樣處理啦!

  .add( Projections.rowCount(), "catCountByColor" )

  .add( Projections.avg("weight"), "avgWeight" )

  .add( Projections.max("weight"), "maxWeight" )

  .add( Projections.groupProperty("color"), "color" )

 )

 .addOrder( Order.desc("catCountByColor") )

 .addOrder( Order.desc("avgWeight") )

 .list();

也可以使用Property.forName()來表示投影:

List results = session.createCriteria(Cat.class)

 .setProjection( Projections.projectionList()

  .add( Projections.rowCount().as("catCountByColor") )

  .add( Property.forName("weight").avg().as("avgWeight") )

  .add( Property.forName("weight").max().as("maxWeight") )

  .add( Property.forName("color").group().as("color" )

 )

 .addOrder( Order.desc("catCountByColor") )

 .addOrder( Order.desc("avgWeight") )

 .list();

DetachedCriteria類使你在一個session范圍之外創(chuàng)建一個查詢,并且可以使用任意的 Session來執(zhí)行它。
也可以使用spring封裝好的哦!

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)

 .add( Property.forName("sex").eq('F') );

//創(chuàng)建一個Session

Session session = .;

Transaction txn = session.beginTransaction();

List results = query.getExecutableCriteria(session).setMaxResults(100).list();

txn.commit();

session.close();

也可以是作為子查詢

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)

 .setProjection( Property.forName("weight").avg() );

session.createCriteria(Cat.class)

 .add( Property.forName("weight).gt(avgWeight) )

 .list();

上述就是小編為大家分享的DetachedCriteria與Criteria的用方有哪些不同了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站題目:DetachedCriteria與Criteria的用方有哪些不同
本文路徑:http://aaarwkj.com/article12/pjdigc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司網(wǎng)站收錄、服務(wù)器托管、做網(wǎng)站、面包屑導航搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
久久亚洲一区二区三区乱码 | 五月婷婷丁香婷婷丁香| 国产产品在线免费看91| 亚洲av一区二区三区| 日韩成人三级一区二区| 美女一区二区三区日本美女在线观看| 午在线亚洲男人午在线| 免费在线黄色生活大片| 日韩精品中文字幕电影| 婷婷综合伊人久久狠狠| 一区二区三区欧美小黄片| 黄色三级视频一区二区三区| 中文岳妇荡欲丰满肥熟| 国产三级精品av在线| 亚洲国产剧情中文字幕| 免费可以看的黄片欧美| 日韩免费色视频一区| 亚洲欧美精品综合久久99| 亚洲成人精品一区二区| 性生活的视频免费观看麻豆| 日本东京热不卡一区二区| 在线视频一区二区三区精品观看| 亚洲黄色av乱码在线观看| 午夜福利不卡片在线观看| 不卡av免费在线网址| 国产国产成年年人免费看片| 亚洲一区二区三区在线观看| 日韩欧美亚洲一区二区| 国产一区二区黄色录像| 亚洲综合五月天色婷婷| 后入动漫视频在线观看| 成人国产亚洲日本欧美| 亚洲精品乱码精品乱码不卡| 午夜一区二区精品视频国产 | 日本人妻在线不卡视频| 国产原创av剧情愿望成真| 国产成人av网站在线观看| 精品人妻中文字幕一区有码| 日本午夜节目在线观看| 久久精品一区二区三区乱码| 国产精品麻豆久久av|