如果實體對象中沒有關聯對象的情況使用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代碼
- 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”字符的特殊性。上述是個人觀點,並未得到確實的證實。
補充:
如果是三級或更多級查詢怎么辦?
以三級查詢為例,仍引用上面的例子:
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