日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hibernate by example 排除某些列

發(fā)布時(shí)間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate by example 排除某些列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://www.cnblogs.com/helong/articles/2096216.html

Example.excludeProperty

Example作用是:根據(jù)以后的對(duì)象,查找屬性之間的相符的其它對(duì)象用法:

Criteria criteria = session.createCriteria(TUser.class);TUser exUser = new TUser();exUser.setName("Erica");criteria.add(Example.create(exUser)); 復(fù)制代碼

這里我們新建一個(gè)TUser對(duì)象exUser,并作為范本,查詢所有的name屬性與之相同的用戶記錄上列語(yǔ)句等同于:Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.eq("name","Erica")); 默認(rèn)情況下,Hibernate會(huì)過濾掉是列對(duì)象的NUll值屬性,我們也可以通過調(diào)用Example.excludeNone/excludeZeroes 方法來(lái)對(duì)這個(gè)特性進(jìn)行調(diào)整,或者通過Example.excludeProperty方法將某個(gè)屬性排除在外舉例描述Example類的用途大部分我們會(huì)在代碼中進(jìn)行判斷,根據(jù)用戶輸入的查詢生成最終的查詢條件,由于組合條件不確定,往往導(dǎo)致邏輯判斷語(yǔ)句拖沓起伏,如下:

public List querUsers(String name,Integer age)throws HibernateException{   Criteria criteria = session.craeteCriteria(TUser.class);   if(null!=name){   criteria.add(Expression.like("name",name))   } if(null!=age){   criteria.add(Expression.eq("age",age)); } return criteria.list();} 復(fù)制代碼



對(duì)于上面的例子,如果出現(xiàn)了十個(gè),那么情況相當(dāng)復(fù)雜,示例查詢?cè)谶@里,就可以起到相當(dāng)大的作用,我們可以修改如下:

public List querUsers(TUser user){  Criteria criteria =session.createCriteria(TUser.class);  criteria.add(Example.create(user));   return criteria.list();} 復(fù)制代碼

Hibernate復(fù)合查詢

Criteria criteria =session.createCriteria(TUser.class); Criteria addrCriteria=criteria.createCriteria("addresses"); addrCriteria.add(Expression.like("address","%Shanghai")); 復(fù)制代碼


運(yùn)行后Hibernate顯示的SQL語(yǔ)句如下:

select ... from T_USER user inner join T_Address address on user.id=address.user_id where address.address like ? 復(fù)制代碼

Hibernate DetachedCriteria


由某個(gè)Session創(chuàng)建的Criteria實(shí)例,一旦Session銷毀,那么此Criteria實(shí)例也隨之實(shí)效,這很大的程度上限制了Criteria的重用,對(duì)于相同的Criteria查詢條件,每次我們都必須由當(dāng)前Session構(gòu)造其查詢實(shí)例,未免失之繁瑣。
DetachedCriteria 可以脫離Session實(shí)例獨(dú)立存在,這樣,我們就可以將某些通用的Criteria查詢條件進(jìn)行抽離,每次使用時(shí)在與當(dāng)前Session實(shí)例綁定以獲得更好的代碼重用效果,用法如下:

DetachedCriteria deCriteria =DetachedCriteria.forClass(TUser.class); deCriteria.add(Expression.eq("name","Erica")); deCriteria.add(Expression.eq("sex",new Integer(1))); Criteria criteria =deCriteria.getExecutableCriteria(session); List list =criteria.list(); 復(fù)制代碼


我們可以采用DetachedCriteria實(shí)現(xiàn)子查詢,例子如下:

DetachedCriteria avgAge =DetachedCriteria.forClass(TUser.class); avgAge.setProjection(Projections.avg("avg")); Criteria criteria =session.createCriteria(TUser.class); criteria.add(Subqueries.propertyGt("age",avgAge)); List list =criteria.list(); 復(fù)制代碼

通過Subqueries我們可以將DetachedCriteria納入查詢表達(dá)式,反映SQL上則是一個(gè)典型的子查詢語(yǔ)句,上例運(yùn)行期生成的SQL語(yǔ)句大致如下:

select ... from T_USER user where age>(select avg(age) from T_USER)

Hibernate Criteria 分組于統(tǒng)計(jì)


下列我們采用TUser對(duì)象中的age分組

Criteria criteria =session.createCriteria(TUser.class); criteria.setProjection(Projections.groupProptery("age")); List list criteria.list(); 復(fù)制代碼


通過上例運(yùn)行期大概生成的SQL語(yǔ)句如下:

select this.age as y0_ from T_USER this_ group by this_.age


可以看到Projections.groupProperty()方法實(shí)際上是對(duì)SQL group by 子句的封裝,同樣,我們可以通過Projections.avg()、rowCount()、count()、max()、min()、countDistinct()等方法實(shí)現(xiàn)查詢統(tǒng)計(jì)功能。


另外,對(duì)于多條件組合的統(tǒng)計(jì)、分組功能,我們可以借助ProjectionList完成,下面例子中,我們統(tǒng)計(jì)了各個(gè)年齡層次中的用戶數(shù)量:

ProjectionList projectionList =Projections.projectionList(); projectionList.add(Projections.groupProperty("age")); projectionList.add(Projections.rowCount()); Criteria criteria = session.createCriteria(TUser.class); criteria.setProjection(projectionList); List list criteria.list(); 復(fù)制代碼

Hibernate 屬性查詢
有時(shí)候我們并不需要獲取完整的實(shí)體對(duì)象,如在一個(gè)下拉框中顯示用戶名,此時(shí)我們需要的數(shù)據(jù)僅僅是實(shí)體對(duì)象的某個(gè)屬性(庫(kù)表記錄中的某個(gè)字段信息)。同樣通過HQL我們也可以簡(jiǎn)單地做到這一點(diǎn)

List list = session.criteriaQuery("select user.name from TUser user").list(); Iterator it =list.iterator(); while(is.hashNext){ System.out.println(it.next); } 復(fù)制代碼

HQL "select user.name from TUser user" 指定了我們只需要獲取TUser對(duì)象的name屬性(也就是T_User表的name字段)。此時(shí)返回的是List數(shù)據(jù)結(jié)構(gòu)中,每個(gè)條目都是一個(gè)Stirng類型的那么數(shù)據(jù)(而非TUser對(duì)象)

List list = session.criteriaQuery("select user.name,user.age from TUser user").list(); Iterator it =list.iterator(); while(is.hashNext){ Object[] obj=(Object[])it.next System.out.println(obj[0]); System.out.println(obj[1]); }


HQL select user.name,user.age from TUser user 表明我們需要讀取name和age屬性的內(nèi)容,而此時(shí),返回的list數(shù)據(jù)結(jié)構(gòu)中,每個(gè)條目都是一個(gè)對(duì)象數(shù)據(jù)(Objcet[]),其中一次包含了我們所獲得的屬性數(shù)據(jù)
如果覺得返回?cái)?shù)組的方式不夠符合面向?qū)ο蟮娘L(fēng)格,我們可以通過HQL中動(dòng)態(tài)構(gòu)造對(duì)象實(shí)例的方法對(duì)這些平面化的數(shù)據(jù)進(jìn)行封裝。

List list = session.criteriaQuery("select new TUser(user.name,user.age) from TUser user").list(); Iterator it =list.iterator(); while(is.hashNext){ TUser user=(TUser)it.next System.out.println(user.getName()); } 復(fù)制代碼

實(shí)體更新與刪除


Hibernate 2中查詢及更新

TUser user =(TUser)session.get(TUser.class,new Integer(1)); user.setAge(new Integer(18)); session.save(user); 復(fù)制代碼


以上代碼完成ID=1的用戶數(shù)據(jù)更行,那么,如果我們需要將庫(kù)表中所有的用戶的年齡置為18,該如何操作呢,別無(wú)它法,我們只有搜先利用HQL “from TUser ”查詢出所有的實(shí)體,設(shè)置年屬性后在逐一保存

Hibernate3 HQL提供了更為靈活的便捷的實(shí)現(xiàn)方式(bulkdelete/update)

Transaction tx= session.beginTranscation(); String sql="update TUser set age=18 where id=1"; Query query =session.createQuery(hql); query.executeUpdate(); tx.commit(); 復(fù)制代碼



HQL delte子句使用

Transaction tx= session。beginTranscation(); String sql="delete TUser where id=1"; Query query =session.createQuery(hql); int ret =query.executeUpdate(); System.out.println(ret); tx.commit(); 復(fù)制代碼


參數(shù)綁定
String sql="from TUser user where user.age>"+age;
編碼更加凌亂,可讀性降低、難以進(jìn)行性能優(yōu)化、引入額外的安全風(fēng)行
我們應(yīng)該采用
session.find("from TUser user where user.name=?","Erica",Hibernate.STRING);
多參數(shù)的情況

Object[] args = new Object[]{"Erica",new Integer(20)}; Type[] types = new Type[]{Hibernate.STRING,Hibernate.INTEGER}; session.find("from TUser user where user.name=? and user.age>?",args,types); 復(fù)制代碼


或者通過Query接口進(jìn)行參數(shù)填充

Query query = session.createQuery("from TUser user where user.name=? and user.age>?"); query.setString(0,"Erica"); quer.setInteger(1,20); 復(fù)制代碼


占位符

String sql=from TUser user where user.name=:name and user.age>:age"; Query query=session.createQuery(hql); query.setParameter("name","Erica"); query.setParameter("age",18); 復(fù)制代碼 ? =========== http://developer.51cto.com/art/200909/153767.htm

最近在項(xiàng)目中使用 Spring 和 Hibernate 進(jìn)行開發(fā),有感于Hibernate Criteria 比較好用,在查詢方法設(shè)計(jì)上可以靈活的根據(jù) Criteria 的特點(diǎn)來(lái)方便地進(jìn)行查詢條件的組裝。本人對(duì)此進(jìn)行了整理,希望讀者能夠借鑒。

現(xiàn)在對(duì)Hibernate Criteria 的用法進(jìn)行總結(jié):

Hibernate 設(shè)計(jì)了 CriteriaSpecification 作為 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。Criteria 和 DetachedCriteria 的主要區(qū)別在于創(chuàng)建的形式不一樣, Criteria 是在線的,所以它是由 Hibernate Session 進(jìn)行創(chuàng)建的;而 DetachedCriteria 是離線的,創(chuàng)建時(shí)無(wú)需 Session,DetachedCriteria 提供了 2 個(gè)靜態(tài)方法 forClass(Class) 或 forEntityName(Name) 進(jìn)行DetachedCriteria 實(shí)例的創(chuàng)建。 Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根據(jù)DetachedCriteria 來(lái)返回查詢結(jié)果。

Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 設(shè)置查詢條件。可以設(shè)置 FetchMode( 聯(lián)合查詢抓取的模式 ) ,設(shè)置排序方式。對(duì)于 Criteria 還可以設(shè)置 FlushModel (沖刷 Session 的方式)和 LockMode (數(shù)據(jù)庫(kù)鎖模式)。

下面對(duì) Hibernate Criterion 和 Projection 進(jìn)行詳細(xì)說(shuō)明。

Hibernate Criterion 是 Criteria 的查詢條件。Criteria 提供了 add(Criterion criterion) 方法來(lái)添加查詢條件。
Hibernate Criterion 接口的主要實(shí)現(xiàn)包括: Example 、 Junction 和 SimpleExpression 。而 Junction 的實(shí)際使用是它的兩個(gè)子類 conjunction 和 disjunction ,分別是使用 AND 和 OR 操作符進(jìn)行來(lái)聯(lián)結(jié)查詢條件集合。Criterion 的實(shí)例可以通過 Restrictions 工具類來(lái)創(chuàng)建,Restrictions 提供了大量的靜態(tài)方法,如 eq (等于)、 ge (大于等于)、 between 等來(lái)方法的創(chuàng)建 Criterion 查詢條件(SimpleExpression 實(shí)例)。

除此之外, Restrictions 還提供了方法來(lái)創(chuàng)建 conjunction 和disjunction 實(shí)例,通過往該實(shí)例的 add(Criteria) 方法來(lái)增加查詢條件形成一個(gè)查詢條件集合。至于 Example 的創(chuàng)建有所不同, Example 本身提供了一個(gè)靜態(tài)方法 create(Object entity) ,即根據(jù)一個(gè)對(duì)象(實(shí)際使用中一般是映射到數(shù)據(jù)庫(kù)的對(duì)象)來(lái)創(chuàng)建。然后可以設(shè)置一些過濾條件:

  • Example?exampleUser?=Example.create(u)? ?
  • .ignoreCase()?//?忽略大小寫? ?
  • .enableLike(MatchMode.ANYWHERE);? ?
  • //?對(duì)?String?類型的屬性,無(wú)論在那里值在那里都匹配。相當(dāng)于?%value%? ?
  • Project 主要是讓 Criteria 能夠進(jìn)行報(bào)表查詢,并可以實(shí)現(xiàn)分組。 Project 主要有SimpleProjection 、 ProjectionList 和 Property 三個(gè)實(shí)現(xiàn)。其中 SimpleProjection 和ProjectionList 的實(shí)例化是由內(nèi)建的 Projections 來(lái)完成,如提供的 avg 、 count 、 max 、min 、 sum 可以讓開發(fā)者很容易對(duì)某個(gè)字段進(jìn)行統(tǒng)計(jì)查詢。Property 是對(duì)某個(gè)字段進(jìn)行查詢條件的設(shè)置,如通過Porperty.forName(“color”).in(new String[]{“black”,”red”,”write”}); 則可以創(chuàng)建一個(gè) Project 實(shí)例。通過
    criteria 的 add(Project) 方法加入到查詢條件中去。使用 Criteria 進(jìn)行查詢,主要要清晰的是 Hibernate 提供了那些類和方法來(lái)滿足開發(fā)中查詢條件的創(chuàng)建和組裝,下面介紹幾種用法:

    1. 創(chuàng)建一個(gè)Criteria 實(shí)例
    org.hibernate.Criteria接口表示特定持久類的一個(gè)查詢。Session是 Criteria實(shí)例的工廠。

  • Criteria?crit?=?sess.createCriteria(Cat.class); ?
  • crit.setMaxResults(50); ?
  • List?cats?=?crit.list(); ?
  • ? ?
  • 2. 限制結(jié)果集內(nèi)容
    一個(gè)單獨(dú)的查詢條件是org.hibernate.criterion.Criterion 接口的一個(gè)實(shí)例。

    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(); ?
  • 約束可以按邏輯分組。

  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.add(?Restrictions.like("name",?"Fritz%")?) ?
  • ????.add(?Restrictions.or( ?
  • ????????Restrictions.eq(?"age",?new?Integer(0)?), ?
  • ????????Restrictions.isNull("age") ?
  • ????)?) ?
  • ????.list(); ?
  • ? ?
  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.add(?Restrictions.in(?"name",?new?String[]?{?"Fritz",?"Izi",?"Pk"?}?)?) ?
  • ????.add(?Restrictions.disjunction() ?
  • ????????.add(?Restrictions.isNull("age")?) ?
  • ????????.add(?Restrictions.eq("age",?new?Integer(0)?)?) ?
  • ????????.add(?Restrictions.eq("age",?new?Integer(1)?)?) ?
  • ????????.add(?Restrictions.eq("age",?new?Integer(2)?)?) ?
  • ????)?) ?
  • ????.list(); ?
  • Hibernate提供了相當(dāng)多的內(nèi)置criterion類型(Restrictions 子類), 但是尤其有用的是可以允許你直接使用SQL。

  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.add(?Restrictions.sql("lower({alias}.name)?like?lower(?)",?"Fritz%",? ?
  • ?
  • Hibernate.STRING)?) ?
  • ????.list(); ?
  • {alias}占位符應(yīng)當(dāng)被替換為被查詢實(shí)體的列別名。
    Property實(shí)例是獲得一個(gè)條件的另外一種途徑。你可以通過調(diào)用Property.forName() 創(chuàng)建一個(gè)Property。

  • Property?age?=?Property.forName("age"); ?
  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.add(?Restrictions.disjunction() ?
  • ????????.add(?age.isNull()?) ?
  • ????????.add(?age.eq(?new?Integer(0)?)?) ?
  • ????????.add(?age.eq(?new?Integer(1)?)?) ?
  • ????????.add(?age.eq(?new?Integer(2)?)?) ?
  • ????)?) ?
  • ????.add(?Property.forName("name").in(?new?String[]?{?"Fritz",?"Izi",?"Pk"?}?)?) ?
  • ????.list(); ?
  • 3. 結(jié)果集排序
    你可以使用org.hibernate.criterion.Order來(lái)為查詢結(jié)果排序。

  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.add(?Restrictions.like("name",?"F%") ?
  • ????.addOrder(?Order.asc("name")?) ?
  • ????.addOrder(?Order.desc("age")?) ?
  • ????.setMaxResults(50) ?
  • ????.list(); ?
  • ? ?
  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.add(?Property.forName("name").like("F%")?) ?
  • ????.addOrder(?Property.forName("name").asc()?) ?
  • ????.addOrder(?Property.forName("age").desc()?) ?
  • ????.setMaxResults(50) ?
  • ????.list(); ?
  • 4. 關(guān)聯(lián)
    你可以使用createCriteria()非常容易的在互相關(guān)聯(lián)的實(shí)體間建立約束。

  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.add(?Restrictions.like("name",?"F%") ?
  • ????.createCriteria("kittens") ?
  • ????????.add(?Restrictions.like("name",?"F%") ?
  • ????.list(); ?
  • 注意第二個(gè) createCriteria()返回一個(gè)新的 Criteria實(shí)例,該實(shí)例引用kittens 集合中的元素。
    接下來(lái),替換形態(tài)在某些情況下也是很有用的。

  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.createAlias("kittens",?"kt") ?
  • ????.createAlias("mate",?"mt") ?
  • ????.add(?Restrictions.eqProperty("kt.name",?"mt.name")?) ?
  • ????.list(); ?
  • (createAlias()并不創(chuàng)建一個(gè)新的 Criteria實(shí)例。)
    Cat實(shí)例所保存的之前兩次查詢所返回的kittens集合是 沒有被條件預(yù)過濾的。如果你希望只獲得符合條件的kittens, 你必須使用returnMaps()。

  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.createCriteria("kittens",?"kt") ?
  • ????.add(?Restrictions.eq("name",?"F%")?) ?
  • ????.returnMaps() ?
  • ????.list(); ?
  • Iterator?iter?=?cats.iterator(); ?
  • while?(?iter.hasNext()?)?{ ?
  • ????Map?map?=?(Map)?iter.next(); ?
  • ????Cat?cat?=?(Cat)?map.get(Criteria.ROOT_ALIAS); ?
  • ????Cat?kitten?=?(Cat)?map.get("kt"); ?
  • } ?
  • 5. 動(dòng)態(tài)關(guān)聯(lián)抓取
    你可以使用setFetchMode()在運(yùn)行時(shí)定義動(dòng)態(tài)關(guān)聯(lián)抓取的語(yǔ)義。

  • List?cats?=?sess.createCriteria(Cat.class) ?
  • ????.add(?Restrictions.like("name",?"Fritz%")?) ?
  • ????.setFetchMode("mate",?FetchMode.EAGER) ?
  • ????.setFetchMode("kittens",?FetchMode.EAGER) ?
  • ????.list(); ?
  • 這個(gè)查詢可以通過外連接抓取mate和kittens。

    6. 查詢示例
    org.hibernate.criterion.Example類允許你通過一個(gè)給定實(shí)例 構(gòu)建一個(gè)條件查詢。

  • org.hibernate.criterion.Example類允許你通過一個(gè)給定實(shí)例?構(gòu)建一個(gè)條件查詢。 ?
  • ? ?
  • Cat?cat?=?new?Cat(); ?
  • cat.setSex('F'); ?
  • cat.setColor(Color.BLACK); ?
  • List?results?=?session.createCriteria(Cat.class) ?
  • ????.add(?Example.create(cat)?) ?
  • ????.list(); ?
  • 版本屬性、標(biāo)識(shí)符和關(guān)聯(lián)被忽略。默認(rèn)情況下值為null的屬性將被排除。
    可以自行調(diào)整Example使之更實(shí)用。

  • ? ?
  • Example?example?=?Example.create(cat) ?
  • ????.excludeZeroes()???????????//exclude?zero?valued?properties ?
  • ????.excludeProperty("color")??//exclude?the?property?named?"color" ?
  • ????.ignoreCase()??????????????//perform?case?insensitive?string?comparisons ?
  • ????.enableLike();?????????????//use?like?for?string?comparisons ?
  • List?results?=?session.createCriteria(Cat.class) ?
  • ????.add(example) ?
  • ????.list();?
  • 甚至可以使用examples在關(guān)聯(lián)對(duì)象上放置條件。

  • List?results?=?session.createCriteria(Cat.class) ?
  • ????.add(?Example.create(cat)?) ?
  • ????.createCriteria("mate") ?
  • ????????.add(?Example.create(?cat.getMate()?)?) ?
  • ????.list(); ?
  • 7. 投影(Projections)、聚合(aggregation)和分組(grouping)
    org.hibernate.criterion.Projections是 Projection 的實(shí)例工廠。我們通過調(diào)用setProjection()應(yīng)用投影到一個(gè)查詢。

  • 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();?
  • 與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的hibernate by example 排除某些列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。