http://www.cnblogs.com/helong/articles/2096216.html
Example.excludeProperty
Example作用是:根據(jù)以后的對象,查找屬性之間的相符的其它對象用法:
Criteria criteria = session.createCriteria(TUser. class ); TUser exUser = new TUser(); exUser.setName( " Erica " ); criteria.add(Example.create(exUser)); 復(fù)制代碼
這里我們新建一個TUser對象exUser,并作為范本,查詢所有的name屬性與之相同的用戶記錄上列語句等同于:Criteria criteria = session.createCriteria(TUser.class);criteria.add(Expression.eq("name","Erica"));
默認(rèn)情況下,Hibernate會過濾掉是列對象的NUll值屬性,我們也可以通過調(diào)用Example.excludeNone/excludeZeroes 方法來對這個特性進(jìn)行調(diào)整,或者通過Example.excludeProperty方法將某個屬性排除在外舉例描述Example類的用途大部分我們會在代碼中進(jìn)行判斷,根據(jù)用戶輸入的查詢生成最終的查詢條件,由于組合條件不確定,往往導(dǎo)致邏輯判斷語句拖沓起伏,如下:
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ù)制代碼
對于上面的例子,如果出現(xiàn)了十個,那么情況相當(dāng)復(fù)雜,示例查詢在這里,就可以起到相當(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語句如下:
select ... from T_USER user inner join T_Address address on user .id = address. user_id where address.address like ? 復(fù)制代碼
Hibernate DetachedCriteria
由某個Session創(chuàng)建的Criteria實(shí)例,一旦Session銷毀,那么此Criteria實(shí)例也隨之實(shí)效,這很大的程度上限制了Criteria的重用,對于相同的Criteria查詢條件,每次我們都必須由當(dāng)前Session構(gòu)造其查詢實(shí)例,未免失之繁瑣。 DetachedCriteria 可以脫離Session實(shí)例獨(dú)立存在,這樣,我們就可以將某些通用的Criteria查詢條件進(jìn)行抽離,每次使用時在與當(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上則是一個典型的子查詢語句,上例運(yùn)行期生成的SQL語句大致如下:
select ... from T_USER user where age > ( select avg (age) from T_USER)
Hibernate Criteria 分組于統(tǒng)計
下列我們采用TUser對象中的age分組
Criteria criteria = session.createCriteria(TUser. class );
criteria.setProjection(Projections.groupProptery( " age " ));
List list criteria.list(); 復(fù)制代碼
通過上例運(yùn)行期大概生成的SQL語句如下:
select this.age as y0_ from T_USER this_ group by this_.age
可以看到Projections.groupProperty()方法實(shí)際上是對SQL group by 子句的封裝,同樣,我們可以通過Projections.avg()、rowCount()、count()、max()、min()、countDistinct()等方法實(shí)現(xiàn)查詢統(tǒng)計功能。
另外,對于多條件組合的統(tǒng)計、分組功能,我們可以借助ProjectionList完成,下面例子中,我們統(tǒng)計了各個年齡層次中的用戶數(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ù)據(jù)僅僅是實(shí)體對象的某個屬性(庫表記錄中的某個字段信息)。同樣通過HQL我們也可以簡單地做到這一點(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對象的name屬性(也就是T_User表的name字段)。此時返回的是List數(shù)據(jù)結(jié)構(gòu)中,每個條目都是一個Stirng類型的那么數(shù)據(jù)(而非TUser對象)
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)容,而此時,返回的list數(shù)據(jù)結(jié)構(gòu)中,每個條目都是一個對象數(shù)據(jù)(Objcet[]),其中一次包含了我們所獲得的屬性數(shù)據(jù) 如果覺得返回數(shù)組的方式不夠符合面向?qū)ο蟮娘L(fēng)格,我們可以通過HQL中動態(tài)構(gòu)造對象實(shí)例的方法對這些平面化的數(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ù)更行,那么,如果我們需要將庫表中所有的用戶的年齡置為18,該如何操作呢,別無它法,我們只有搜先利用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ù) Criteria 的特點(diǎn)來方便地進(jìn)行查詢條件的組裝。本人對此進(jìn)行了整理,希望讀者能夠借鑒。
現(xiàn)在對Hibernate Criteria 的用法進(jìn)行總結(jié):
Hibernate 設(shè)計了 CriteriaSpecification 作為 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。Criteria 和 DetachedCriteria 的主要區(qū)別在于創(chuàng)建的形式不一樣, Criteria 是在線的,所以它是由 Hibernate Session 進(jìn)行創(chuàng)建的;而 DetachedCriteria 是離線的,創(chuàng)建時無需 Session,DetachedCriteria 提供了 2 個靜態(tài)方法 forClass(Class) 或 forEntityName(Name) 進(jìn)行DetachedCriteria 實(shí)例的創(chuàng)建。 Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根據(jù)DetachedCriteria 來返回查詢結(jié)果。
Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 設(shè)置查詢條件。可以設(shè)置 FetchMode( 聯(lián)合查詢抓取的模式 ) ,設(shè)置排序方式。對于 Criteria 還可以設(shè)置 FlushModel (沖刷 Session 的方式)和 LockMode (數(shù)據(jù)庫鎖模式)。
下面對 Hibernate Criterion 和 Projection 進(jìn)行詳細(xì)說明。
Hibernate Criterion 是 Criteria 的查詢條件。Criteria 提供了 add(Criterion criterion) 方法來添加查詢條件。 Hibernate Criterion 接口的主要實(shí)現(xiàn)包括: Example 、 Junction 和 SimpleExpression 。而 Junction 的實(shí)際使用是它的兩個子類 conjunction 和 disjunction ,分別是使用 AND 和 OR 操作符進(jìn)行來聯(lián)結(jié)查詢條件集合。Criterion 的實(shí)例可以通過 Restrictions 工具類來創(chuàng)建,Restrictions 提供了大量的靜態(tài)方法,如 eq (等于)、 ge (大于等于)、 between 等來方法的創(chuàng)建 Criterion 查詢條件(SimpleExpression 實(shí)例)。
除此之外, Restrictions 還提供了方法來創(chuàng)建 conjunction 和disjunction 實(shí)例,通過往該實(shí)例的 add(Criteria) 方法來增加查詢條件形成一個查詢條件集合。至于 Example 的創(chuàng)建有所不同, Example 本身提供了一個靜態(tài)方法 create(Object entity) ,即根據(jù)一個對象(實(shí)際使用中一般是映射到數(shù)據(jù)庫的對象)來創(chuàng)建。然后可以設(shè)置一些過濾條件:
Example?exampleUser ?=Example .create(u)? ? .ignoreCase()?//?忽略大小寫? ? .enableLike(MatchMode.ANYWHERE);? ? //?對?String?類型的屬性,無論在那里值在那里都匹配。相當(dāng)于?%value%? ? Project 主要是讓 Criteria 能夠進(jìn)行報表查詢,并可以實(shí)現(xiàn)分組。 Project 主要有SimpleProjection 、 ProjectionList 和 Property 三個實(shí)現(xiàn)。其中 SimpleProjection 和ProjectionList 的實(shí)例化是由內(nèi)建的 Projections 來完成,如提供的 avg 、 count 、 max 、min 、 sum 可以讓開發(fā)者很容易對某個字段進(jìn)行統(tǒng)計查詢。Property 是對某個字段進(jìn)行查詢條件的設(shè)置,如通過Porperty.forName(“color”).in(new String[]{“black”,”red”,”write”}); 則可以創(chuàng)建一個 Project 實(shí)例。通過 criteria 的 add(Project) 方法加入到查詢條件中去。使用 Criteria 進(jìn)行查詢,主要要清晰的是 Hibernate 提供了那些類和方法來滿足開發(fā)中查詢條件的創(chuàng)建和組裝,下面介紹幾種用法:
1. 創(chuàng)建一個Criteria 實(shí)例 org.hibernate.Criteria接口表示特定持久類的一個查詢。Session是 Criteria實(shí)例的工廠。
Criteria?crit ?=?sess .createCriteria(Cat.class); ? crit.setMaxResults(50); ? List?cats ?=?crit .list(); ? ? ? 2. 限制結(jié)果集內(nèi)容 一個單獨(dú)的查詢條件是org.hibernate.criterion.Criterion 接口的一個實(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í)例是獲得一個條件的另外一種途徑。你可以通過調(diào)用Property.forName() 創(chuàng)建一個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來為查詢結(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(); ? 注意第二個 createCriteria()返回一個新的 Criteria實(shí)例,該實(shí)例引用kittens 集合中的元素。 接下來,替換形態(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)建一個新的 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. 動態(tài)關(guān)聯(lián)抓取 你可以使用setFetchMode()在運(yùn)行時定義動態(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。 6. 查詢示例 org.hibernate.criterion.Example類允許你通過一個給定實(shí)例 構(gòu)建一個條件查詢。
org.hibernate.criterion.Example類允許你通過一個給定實(shí)例?構(gòu)建一個條件查詢。 ? ? ? Cat?cat ?=?new ?Cat(); ? cat.setSex('F'); ? cat.setColor(Color.BLACK); ? List?results ?=?session .createCriteria(Cat.class) ? ????.add(?Example.create(cat)?) ? ????.list(); ? 版本屬性、標(biāo)識符和關(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)對象上放置條件。
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)用投影到一個查詢。
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ù)專家面對面 20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔 為你收集整理的hibernate by example 排除某些列 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。