编辑以反映早先的遗漏: 我想定义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
...
答案 0 :(得分:1)
在项实体
中尝试此操作 @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = true)
private QOH qoh;
这实际上在Item&之间创建了1到0..1的关系。 QOH。
这将生成左外连接。
答案 1 :(得分:0)
将其他stackoverflow.com问题的答案拼凑在一起,与我的问题非常相似,我找到了解决方案:
...
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时抛出错误。
如果我错了,请纠正我。