Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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@OneToOne with formula-列不能外部联接到子查询_Java_Oracle_Hibernate_Formula_Outer Join - Fatal编程技术网

Java Hibernate@OneToOne with formula-列不能外部联接到子查询

Java Hibernate@OneToOne with formula-列不能外部联接到子查询,java,oracle,hibernate,formula,outer-join,Java,Oracle,Hibernate,Formula,Outer Join,我有一个实体,我们称之为Policy保单由投保人持有。不是所有的都是一次,只有一个,但它们可以随着时间的推移而改变。我可以使用@OneToMany注释轻松地将投保人映射到保单。但其中一个持有者是特别的,因为它是当前的持有者。我需要一个特殊的,很可能是瞬态的,可以保持其引用的字段 其中一个问题是没有严格的鉴别器来区分当前持有者和其他持有者。唯一能找出其中哪一个的方法是这个特殊的,我需要找到最新的附件当持有人被添加。理论上,可以通过查询和子查询轻松完成: SELECT * FROM holders

我有一个实体,我们称之为
Policy
<代码>保单由
投保人持有。不是所有的都是一次,只有一个,但它们可以随着时间的推移而改变。我可以使用
@OneToMany
注释轻松地将
投保人
映射到保单。但其中一个持有者是特别的,因为它是当前的持有者。我需要一个特殊的,很可能是瞬态的,可以保持其引用的字段

其中一个问题是没有严格的鉴别器来区分当前持有者和其他持有者。唯一能找出其中哪一个的方法是这个特殊的,我需要找到最新的附件当持有人被添加。理论上,可以通过查询和子查询轻松完成:

SELECT * FROM holders h 
WHERE h.policy_id = :myPolicyId AND h.annex_id = 
(SELECT MAX(annex_id) FROM holders sh WHERE sh.policy_id = h.policy_id)
映射当前的
投保人
似乎是个好主意,因为字段要使用
@JoinColumnOrFormulas
注释。我这样试过:

public class Policy {

    @OneToMany(...)
    private Set<PolicyHolder> holders;

    @ManyToOne
    @JoinColumnOrFormulas({
      @JoinColumnOrFormula(
        column = @JoinColumn(columnName = "policy_id", referencedColumnName = "policy_id")),
      @JoinColumnOrFormula(
        formula = "SELECT MAX(annex_id) FROM holders h WHERE h.policy_id = policyId", 
        referencedColumnName = "annex_id")      
      )
    })
    private PolicyHolder currentHolder;
}
公共类策略{
@一个女人(…)
私人集合持有人;
@许多酮
@联合柱公式({
@联合柱公式(
column=@JoinColumn(columnName=“policy\u id”,referencedColumnName=“policy\u id”),
@联合柱公式(
公式=“从持有人h中选择最大值(附件id),其中h.policy\u id=policy id”,
referencedColumnName=“附件号”)
)
})
私人保单持有人;
}
我甚至不知道上面的代码是否有效。我现在无法检查它,它是写在记事本上的。无论如何,它以Hibernate生成正确查询的方式为我工作。但查询未在Oracle数据库上执行,错误消息为:
列可能未与子查询外部联接(为什么?)

好的,所以我尝试强制Hibernate生成内部连接而不是外部连接。这是安全的,因为对于
保单
,始终至少有一名
保单持有人
。我试图将该列设置为
nullable=false
(我知道-它用于模式生成)和
optional=false
。但是没有任何结果


有什么想法吗?

我也有类似的情况,我也无法让hibernate生成内部连接。外部联接不能使用子查询完成(正如您已经注意到的)。因此,我的解决方案(虽然不是最好的)是在oracle中创建函数。然后它将成为:

 @ManyToOne
@JoinColumnOrFormulas({
  @JoinColumnOrFormula(
    column = @JoinColumn(columnName = "policy_id", referencedColumnName = "policy_id")),
  @JoinColumnOrFormula(
    formula = "getMaxAnnexForPolicy(policyId)", 
    referencedColumnName = "annex_id")      
  )
})
private PolicyHolder currentHolder;
并创建如下函数:

CREATE OR REPLACE Function getMaxAnnexForPolicy
   ( policyId in varchar2)
   RETURN varchar2
IS
   res varchar2(200);
BEGIN
 SELECT MAX(annex_id) into res FROM holders h WHERE h.policy_id = policyId;
RETURN res;
end getMaxAnnexForPolicy;
我知道这是一种变通方法,但在我的场景中效果很好。如果它是一个函数,hibernate知道它将只返回一行。否则,它不会对查询求值以查看是否添加了max(),它还会返回一行