【发布时间】:2015-09-23 21:44:41
【问题描述】:
我有一个实体,我们称之为Policy。 Policy 由 PolicyHolders 持有。不是一次全部,只有一个,但它们可以随着时间的推移而改变。我可以使用 @OneToMany 注释轻松地将 PolicyHolders 映射到策略。但是其中一位持有者很特别,因为它是当前持有者。我需要特殊的、很可能是瞬态的字段,它可以保留其引用。
其中一个问题是没有严格的鉴别器来区分当前持有人与其他人。唯一的办法是找出其中一个是这个特殊的,我需要在添加持有人时找到最新的附件。理论上可以通过查询和子查询轻松完成:
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)
将当前PolicyHolder 映射为一个字段似乎是个好主意,即使用@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;
}
我什至不知道上面这段代码是否有效。我现在无法检查它,它是用记事本写的。无论如何,它以 Hibernate 生成正确查询的方式对我有用。但是查询没有在 Oracle 数据库上执行并显示错误消息:A column may not be outer-joined to a subquery(为什么?)。
好的,所以我尝试强制 Hibernate 生成内部联接而不是外部联接。这是安全的,因为总是至少有一个policy holder 对应一个policy。我尝试将列设置为nullable = false(我知道-它用于生成模式)和optional = false。但没有任何结果。
有什么想法吗?
【问题讨论】:
标签: java oracle hibernate formula outer-join