原文出自:http://bubble.iteye.com/blog/418926
如果實體對象中沒有關聯對象的情況使用DetachedCriteria進行查詢是一件很簡單的事情。
如果實體對象中含有OneToOne或者ManyToOne關聯對象的情況可以參考下面方式,使用別名:
假設要通過stuName查詢一個學生Student記錄,可以如下:
- DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
- dc.add(Restrictions.like("stuName", stuName, MatchMode.ANYWHERE));
如果要通過Student的Team的teamName查詢一個Student記錄,很多人都會這么寫:
- DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
- dc.add(Restrictions.like("team.teamName", teamName, MatchMode.ANYWHERE));
遺憾的是上述程序報錯,說是在Student中找不到team.teamName屬性,這是可以理解的。那么如何通過teamName查找Student呢?
可以這么寫:
- DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
- dc.createAlias("team", "t");
- dc.add(Restrictions.like("t.teamName", teamName, MatchMode.ANYWHERE));
沒錯,就是要先建立team的引用,才能用team導航到teamName。
這里有一個特殊情況,如果是對引用對象的id查詢,則可以不用建立引用,也就是可以不調用createAlias()語句,如下所示:
- DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
- dc.add(Restrictions.like("team.id", teamId, MatchMode.ANYWHERE));
據我個人的經驗,team后只能跟其主鍵屬性,比較其他屬性要用別名。此主鍵屬性可以用“id”字符來指代,也可以用team的主鍵屬性來指代。換句話說,我的Student類的類主鍵“stuId”,不管是在HQL還是在QBC中,都可以用stu.id來指代stu.stuId。在這里可以看出 “id”字符的特殊性。上述是個人觀點,並未得到確實的證實。
補充:
如果是三級或更多級查詢怎么辦?
以三級查詢為例,仍引用上面的例子:
- DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
- dc.createAlias("team", "t");
- dc.createAlias("t.school", "s");
- dc.add(Restrictions.like("s.schoolName", schoolName, MatchMode.ANYWHERE));
如果實體對象中含有OneToMany關聯對象的情況,既是實體中含有list或Set等關聯實體集合的情況下怎么辦呢?
這個還不知道怎么辦,呵呵
方法其實是非常簡單的:
- dc.createAlias("tags", "t");
- dc.add(Restrictions.eq("t.id", tagId));
其中tags是個Set,但是想查找屬性tags中含有id為tagId的實體,使用上面的就可以了。

