假設(shè)要通過stuName查詢一個學(xué)生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導(dǎo)航到teamName。
這里有一個特殊情況,如果是對引用對象的id查詢,則可以不用建立引用,也就是可以不調(diào)用createAlias()語句,如下所示:
?DetachedCriteria?dc?=?DetachedCriteria.forClass(Student.class);
??? dc.add(Restrictions.like("team.id", teamId, MatchMode.ANYWHERE));
??????據(jù)我個人的經(jīng)驗,team后只能跟其主鍵屬性,比較其他屬性要用別名。此主鍵屬性可以用“id”字符來指代,也可以用team的主鍵屬性來指代。換句話說,我的Student類的類主鍵“stuId”,不管是在HQL還是在QBC中,都可以用stu.id來指代stu.stuId。在這里可以看出“id”字符的特殊性。上述是個人觀點,并未得到確實的證實。