[英]Is it possible to make Hibernate 3.1 generate a left outer join for a child entity?
编辑以反映先前的遗漏:我想定义一个0到1行的关系,其中子行永远不会超过1个:
...
@JoinColumn(name="INVENTORY_ID", referencedColumnName="INVENTORY_ID")
@OneToOne
private QOH qoh;
...
所以我的问题是我尝试了所有不使用@JoinColumn而不使用@OneToOne的方法,无论我在选择字段子集时执行Hibernate生成的SQL导致内部联接,这意味着没有QOH记录的Item记录不返回:
...
SELECT i.inventoryId,i.name,i.qoh.quantity FROM Item i;
...
如果我对数据库有完全控制权,则无论何时创建Item,我都将强制创建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
...
在您的Item实体中尝试一下,
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = true)
private QOH qoh;
实际上,这会在Item和QOH之间创建1到0..1的关系。
这将生成左外部联接。
将与我的非常相似的其他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引用添加到要告诉Hibernate在填充该字段时使用LEFT OUTER JOIN的Item中的字段,从而允许空值。 将字段设为可选并不会自动使它在每个查询中都成为LEFT OUTER JOIN,而只是防止在HQL中使用LEFT OUTER JOIN时引发错误。
如果我错了,请纠正我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.