2009-07-28 168 views
2

我有一個奇怪的問題,一個休眠的SQL查詢:休眠sql查詢

的DB關係就像如下:

registration has one invoicerecipient 
registration has many attendees 

我有一個invoicerecipient的persid,所以我應該在這兩個以下獲得案件的相關注冊,但只有第二個案件的作品。有誰知道爲什麼第一個案件不起作用?

select distinct registration from Registration registration, in(registration.attendees) atts where atts.id = :persid or registration.invoicerecipient.id = :persid 

select distinct registration from Registration registration where registration.invoicerecipient.id = :persid 
+0

這兩個語句都是有效的JPA查詢語言。請參閱http://stackoverflow.com/questions/1193483/hibernate-sql-query/1193647#1193647評論。 – 2009-07-28 22:25:54

回答

0

您只能在from零件中使用類型。什麼是「​​」應該是?

正確的解決方法是從你的對象走結構:

select distinct registration 
from Registration registration 
where registration.attendees.id = :persid 
    or registration.invoicerecipient.id = :persid 

休眠知道registration.attendees是一個集合,所以它會產生必要再選擇適合你。

1

我不知道Hibernate是否允許根據Aaron Digulla的答案(registration.attendees.id)在where子句中隱式引用集合。 JPA規範不允許它。這說得通。在Java語言中,registration.getAttendees()。getId()是非法的。

但是你可以根據比較引用:

select distinct registration from Registration registration, in(registration.attendees) atts where atts = :anotherAttendee or registration.invoicerecipient.id = :persid 

IN(registration.attendees)通知類似於INNER JOIN registration.attendees。所以註冊需要至少一個與會者,並且atts.id =:persid應該與Aaron Digulla所說的類型相同。

關於,

+0

謝謝,就是這樣,參加者收藏在這一點上是空的,所以它不起作用。 – ddejmek 2009-07-28 12:33:31