criteria 級聯查詢(轉)


原文出自:http://bubble.iteye.com/blog/418926

如果實體對象中沒有關聯對象的情況使用DetachedCriteria進行查詢是一件很簡單的事情。 
如果實體對象中含有OneToOne或者ManyToOne關聯對象的情況可以參考下面方式,使用別名: 
假設要通過stuName查詢一個學生Student記錄,可以如下: 

Java代碼   收藏代碼
  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.add(Restrictions.like("stuName", stuName, MatchMode.ANYWHERE));  


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

Java代碼   收藏代碼
  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.add(Restrictions.like("team.teamName", teamName, MatchMode.ANYWHERE));  


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

Java代碼   收藏代碼
  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.createAlias("team""t");  
  3. dc.add(Restrictions.like("t.teamName", teamName, MatchMode.ANYWHERE));  


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

這里有一個特殊情況,如果是對引用對象的id查詢,則可以不用建立引用,也就是可以不調用createAlias()語句,如下所示: 

Java代碼   收藏代碼
  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.add(Restrictions.like("team.id", teamId, MatchMode.ANYWHERE));  


據我個人的經驗,team后只能跟其主鍵屬性,比較其他屬性要用別名。此主鍵屬性可以用“id”字符來指代,也可以用team的主鍵屬性來指代。換句話說,我的Student類的類主鍵“stuId”,不管是在HQL還是在QBC中,都可以用stu.id來指代stu.stuId。在這里可以看出 “id”字符的特殊性。上述是個人觀點,並未得到確實的證實。 

補充: 
如果是三級或更多級查詢怎么辦? 

以三級查詢為例,仍引用上面的例子: 

Java代碼   收藏代碼
  1. DetachedCriteria dc = DetachedCriteria.forClass(Student.class);  
  2. dc.createAlias("team""t");  
  3. dc.createAlias("t.school""s");  
  4. dc.add(Restrictions.like("s.schoolName", schoolName, MatchMode.ANYWHERE));  


如果實體對象中含有OneToMany關聯對象的情況,既是實體中含有list或Set等關聯實體集合的情況下怎么辦呢? 
這個還不知道怎么辦,呵呵 
方法其實是非常簡單的: 

Java代碼   收藏代碼
  1. dc.createAlias("tags""t");          
  2. dc.add(Restrictions.eq("t.id", tagId));  


其中tags是個Set,但是想查找屬性tags中含有id為tagId的實體,使用上面的就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM