Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以使Hibernate 3.1为子实体生成左外部联接?_Java_Sql_Hibernate_Hql_Java Ee 6 - Fatal编程技术网

Java 是否可以使Hibernate 3.1为子实体生成左外部联接?

Java 是否可以使Hibernate 3.1为子实体生成左外部联接?,java,sql,hibernate,hql,java-ee-6,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都会导致内部联接,这意味着不返回没有QOH记录的项记录: ...

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

...
@JoinColumn(name="INVENTORY_ID", referencedColumnName="INVENTORY_ID")
@OneToOne
private QOH qoh;
...
因此,我的问题是,我尝试了各种方法使用@OneToOne而不使用@JoinColumn,无论我做什么,Hibernate在选择字段子集时生成的SQL都会导致内部联接,这意味着不返回没有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
...

在您的项目中尝试此操作

    @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
...
基本上,将左外部联接引用添加到项中的字段时,您告诉Hibernate在填充该字段时使用左外部联接,从而允许空值。将字段设置为可选并不会在每个查询中自动将其设置为左外部联接,它只是防止在HQL中使用左外部联接时抛出错误。


如果我错了,请纠正我。

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