jpa 多對多查詢hql語句
任務(wù)和聯(lián)系人是多對多關(guān)系,現(xiàn)在由聯(lián)系人id查詢出所有相關(guān)的任務(wù)"SELECT t from Task t join t.contacters c where c.id = ?1"
比如:
一個老師教許多學(xué)生,一個學(xué)生被許多老師教,一個學(xué)生有好多書,同一種書被許多同學(xué)擁有.
要查詢教擁有書"a"的學(xué)生的老師!
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會翻譯成兩個表的內(nèi)連接關(guān)系
錯誤寫法:
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)
這種方法沒有出錯!不過這種方式要用子查詢!