Posted on 2007-04-16 15:35
七郎歸來 閱讀(190)
評論(0) 編輯 收藏
Hibernate提供了HQL,方便查詢的編寫。但是在某些情況下,我更喜歡用Criteria,因?yàn)樗恼Z義非常明確。
在處理對象關(guān)聯(lián)的時(shí)候,經(jīng)常要對對象下的某個(gè)集合字段進(jìn)行條件限制。比如下面的類:
public class MainClass{ protected long id; protected int type; protected Set<SubClass> subs= new HashSet<SubClass>(); ...... getter/setter} public class SubClass{ protected long id; protected int value; protected Set<MainClass> ms = new HashSet<MainClass>(); ...... getter/setter}
在初始化數(shù)據(jù)中,假設(shè)MainClass的實(shí)例m1含有SubClass的實(shí)例s1,s2,s3;MainClass的實(shí)例m2含有SubClass的實(shí)例s2,s3,s4。
而其中s1,s2,s3,s4的value分別是1,2,3,4
現(xiàn)在要查詢出 MainClass中SubClass集合含有SubClass實(shí)例value為2的的MainClass實(shí)例并且type為1,可以使用下面的查詢方法:
DetachedCriteria criteria = DetachedCriteria .forClass(MainClass.class); criteria.add( Restrictions.eq("type", new Integer(1))) .createAlias("subs", "s").add( Restrictions.eq("s.value", new Integer(2)));
執(zhí)行此查詢對象后會(huì)得到符合條件的MainClass實(shí)例。
需要注意的是在獲取的MainClass實(shí)例中,subs是完全的記錄集,而不是經(jīng)過過濾的記錄集,也就是相當(dāng)于根據(jù)MainClass的ID獲取的完整實(shí)例一樣。
ps:
如果需要過濾subs的記錄集,需要使用額外的過濾方法,請參考Hibernate的具體實(shí)現(xiàn)。
使用HQL也可以很方便地實(shí)現(xiàn),但是需要給出完整的join標(biāo)記,不如createAlias來得方面和直觀。