【问题标题】:Is it possible to make Hibernate 3.1 generate a left outer join for a child entity?是否可以让 Hibernate 3.1 为子实体生成左外连接?
【发布时间】:2014-04-03 12:09:52
【问题描述】:

已编辑以反映之前的遗漏: 我想定义一个 0 到 1 行的关系,其中永远不会有超过 1 个子行:

...
@JoinColumn(name="INVENTORY_ID", referencedColumnName="INVENTORY_ID")
@OneToOne
private QOH qoh;
...

所以我的问题是我已经尝试了各种方法来使用 @OneToOne 而不使用 @JoinColumn 并使用它,无论我做什么,在选择字段子集时由 Hibernate 生成的 SQL 都会导致内部连接,这意味着具有no QOH 记录不返回:

...
SELECT i.inventoryId,i.name,i.qoh.quantity FROM Item i;
...

如果我可以完全控制数据库,我会在任何时候创建项目时强制创建 QOH 记录,但我无法控制数据库或对它的访问。 Hibernate 可以为子实体执行此操作吗?:

...
SELECT ... FROM Item i LEFT OUTER JOIN QOH q ON q.INVENTORY_ID = i.INVENTORY_ID
...

代替:

...
SELECT ... FROM Item i, QOH q WHERE q.INVENTORY_ID = i.INVENTORY_ID
...

【问题讨论】:

  • 除了生成的查询类型之外,您是否能够达到预期的结果?如果不行,你可以粘贴代码吗?
  • @Jay - 不,我只能通过从实体中删除子关系并执行两个查询来实现我想要的结果。没有 QOH 记录的子关系项目不会被退回。当它不存在时,我想要一个空 QOH 子,而当它存在时,我想要一个实例化的 QOH。当QOH丢失时,我尝试的所有方法都没有记录,也就是说,内连接而不是外连接。
  • 你试过@OneToOne(optional = true)吗?
  • 如果您发布代码会更容易。
  • @Jay - 我做到了,我只是省略了与问题无关的所有内容。 qoh 是实体 Item 上的一个字段,但这无关紧要。 QOH 是一个实体。当我从项目 i 中选择 i 时,它不会返回任何没有相应 QOH 的项目

标签: java sql hibernate hql java-ee-6


【解决方案1】:

在你的 Item 实体中试试这个,

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = true)
    private QOH qoh;

这实际上在 Item 和 QOH 之间创建了 1 到 0..1 的关系。

这将生成左外连接。

【讨论】:

    【解决方案2】:

    将与我的非常相似的其他 stackoverflow.com 问题的答案拼凑在一起,我找到了解决方案:

    @Jay 的答案是朝着正确方向迈出的一步(如果我的问题的原始版本是我真正要问的,那将是正确的答案,一夜之间,通过@Jay 的 cmets,我意识到我的问题不完整。使用@Jay 的回答和对我的 HQL 的以下更改:

    ...
    SELECT i.inventoryId,i.name,q.quantity FROM Item i LEFT OUTER JOIN i.qoh as q
    ...
    

    而不是

    ...
    SELECT i.inventoryId,i.name,i.qoh.quantity FROM Item i
    ...
    

    基本上,将 LEFT OUTER JOIN 引用添加到 Item 中的字段是告诉 Hibernate 在填充该字段时使用 LEFT OUTER JOIN,从而允许空值。将字段设为可选并不会在每个查询中自动使其成为 LEFT OUTER JOIN,它只是防止它在您在 HQL 中使用 LEFT OUTER JOIN 时引发错误。

    如果我错了,请纠正我。

    【讨论】:

      猜你喜欢
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      相关资源
      最近更新 更多