是否有可能使Hibernate 3.1为子实体生成左外连接?

时间:2014-04-03 12:09:53

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

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

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

所以我的问题是我已经尝试过各种方式使用@OneToOne而不使用@JoinColumn并使用它而且无论我做什么,Hibernate在选择字段子集时生成的SQL会导致内部连接意味着Item记录有没有返回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
...

2 个答案:

答案 0 :(得分:1)

实体

中尝试此操作
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = true)
    private QOH qoh;

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

这将生成左外连接。

答案 1 :(得分:0)

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

@Jay的回答是朝着正确方向迈出的一步(如果我的问题的原始版本是我真正要求的,一夜之间,以及@Jay的评论我将是正确的答案意识到我的问题是不完整的。使用@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时抛出错误。

如果我错了,请纠正我。