hibernate的離線關聯(多級)查詢


如果實體對象中沒有關聯對象的情況使用DetachedCriteria進行查詢是一件很簡單的事情。 

假設要通過stuName查詢一個學生Student記錄,可以如下: 
Java代碼

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

 

如果實體對象中含有OneToOne或者ManyToOne關聯對象的情況可以參考下面方式,使用別名:
     
如果要通過Student的Team的teamName查詢一個Student記錄,很多人都會這么寫: 
Java代碼

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

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

    DetachedCriteria dc = DetachedCriteria.forClass(Student.class); dc.createAlias("team", "t"); 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代碼

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

 

原文來自:http://hi.baidu.com/dongwujing2009/item/f7ae64197d79c113e3f986bf


免責聲明!

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



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