【问题标题】:hibernate sql query休眠sql查询
【发布时间】:2009-07-28 11:26:30
【问题描述】:

我有一个关于休眠 sql 查询的奇怪问题:

db关系如下:

registration has one invoicerecipient
registration has many attendees

我有发票接收人的身份,所以我应该在以下两种情况下获得相关的注册,但只有第二种情况有效。有人知道为什么第一种情况不起作用吗?

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

【问题讨论】:

标签: java sql hibernate


【解决方案1】:

根据 Aaron Digulla 的回答 (registration.attendees.id),我不知道 Hibernate 是否允许 where 子句中的隐式集合引用。 JPA 规范不允许这样做。这说得通。 registration.getAttendees().getId() 在 Java 语言中是非法的。

但您可以根据以下条件比较参考:

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

Notice IN(registration.attendees) 类似于 INNER JOIN registration.attendees。因此,注册需要至少一个参与者,并且 atts.id = :persid 应该与 Aaron Digulla 所说的共享相同的类型。

问候,

【讨论】:

  • 谢谢,就是这样,此时参加者集合是空的,所以它不起作用。
【解决方案2】:

您只能在 from 部分中使用类型。 “, in(registration.attendees) atts”应该是什么?

正确的解决方案是从你拥有的对象中走结构:

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

Hibernate 知道registration.attendees 是一个集合,因此它会为您生成必要的子选择。

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多