2009-07-28 192 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