任務和聯系人是多對多關系,現在由聯系人id查詢出所有相關的任務
"SELECT t from Task t join t.contacters c where c.id = ?1"
比如:
一個老師教許多學生,一個學生被許多老師教,一個學生有好多書,同一種書被許多同學擁有.
要查詢教擁有書"a"的學生的老師!
Hql語句:
SELECT t FROM Teacher t join t.students s join s.books b where b.name = 'a'
解釋:t.students s中s并不是集合的意思,而是t的students對象的表別名,join t.students s這個hql,hibernate會翻譯成兩個表的內連接關系
錯誤寫法:
SELECT t FROM teacher t where t.students.books.name = 'a'
其實道理是很顯然的,t.students是一個Set,那么這個Set怎么可能有books這樣的屬性呢?同理books.name也不對,所以 使用表間連接并給出別名t.students s,此時的對象s才有books屬性,所以可以寫s.books b,最后使用b.name限制查詢b.name = 'a'.
另外一種寫法:
SELECT t FROM Teacher t,Student s,Book b where s.id in elements(t.students) and b.id in elements(s.books)
這種方法沒有出錯!不過這種方式要用子查詢!