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(),它还会返回一行