15

有一个类与 classOffer具有可选关系Article。以至于有些优惠物品的属性是null有价值的。

如果我使用以下语句,一切正常。我得到了所有的报价,即使是那些没有文章的。

SELECT o FROM Offer o 
         LEFT OUTER JOIN o.article a 
         LEFT OUTER JOIN o.vendor v 
         WHERE v.number = '0212' OR a.nummer = '123456'

如果我将语句更改为:

SELECT o FROM Offer o 
         LEFT OUTER JOIN o.article a 
         LEFT OUTER JOIN o.vendor v 
         WHERE v.number = '0212' OR o.article.nummer = '123456'

我只收到了这些与 不同的文章NULL。这是因为隐式连接 ( o.article.nummer) 的表示法强制进行内部连接。

是否有可能强制左外连接到隐式连接(注释驱动或其他)?如果有机会我可以使用这样的简短形式:

SELECT o FROM Offer o 
         WHERE v.number = '0212' OR o.article.nummer = '123456'
4

4 回答 4

5

您可以尝试@Fetch(FetchMode.JOIN)使用 Article 属性。然而,这是一个 Hibernate 注释。

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

//...

@ManyToOne
@Fetch(FetchMode.JOIN)
Article article;
于 2012-03-06T19:17:49.753 回答
1

据我所知,Hibernate没有提供一种方法来更改 HQL 查询的默认隐式关联连接形式。

我能为自己找到的最佳解决方案是:

  • 使用显式连接信息构建查询;
  • 使用 Criteria,这可能最适合动态查询构建。
于 2014-03-26T18:27:03.833 回答
1

我有一个类似的问题:我有某种GeneralFacility-Table 包含一个 Column SpecificType。并非所有设施都具有这种类型,并且由于 SpecificType 是在 GeneralFacility-Table 条目上内部连接的,因此没有特定类型落在表下。

我解决了这个问题

    @Fetch(FetchMode.SELECT)

模型中的 - 行旁边@ManyToOne。该类型现在在单独的查询中获取,如果不返回任何内容,则不会丢弃 GeneralFacility 查询的结果。

于 2016-04-13T07:25:23.747 回答
0

首先,如果您尝试使用 o.article.nummer 而不是 a.nummer,我相信它会添加一个带有内部连接的额外 WHERE 子句。没有办法明确地说左连接。但是无论如何您都是在查询中自己指定它,所以只需使用别名 a.number = '23456' 中的连接实体。

由于您知道该字段可以为空,因此您不能使用 =,就像您不能在 SQL 中对可空字段使用 = 一样。为此,请使用 COALESCE 将 NULL 值转换为空字符串:

SELECT o FROM Offer o 
    LEFT OUTER JOIN o.article a
    LEFT OUTER JOIN o.vendor v 
        WHERE v.number = '0212'
        OR COALESCE(a.nummer,'') = '123456'
于 2014-10-26T12:50:47.873 回答