【发布时间】:2025-12-05 08:55:01
【问题描述】:
我正在处理一个项目,我有一个“奇怪”的映射需要管理。 没关系,这是结构:
元素由 cmpcode、elmlevel 和 code 组成的单个 FK 组成
发票由cmpcode、element2(2级元素,cmpcode相同)、element3(3级元素,cmpcode相同)组成
所以表 INVOICE 有 4 列
ID
CMPCODE
EL2(具有相同CMPCODE的2级元素的代码)
EL3(具有相同CMPCODE的3级元素的代码)
我对 Invoice.java 类的映射是:
@Id
private Integer id;
@ManyToOne
@JoinColumn(name = "CMPCODE")
private Company company;
// This one does the mapping to Element, by forcing ELMLEVEL at 2, and using CMPCODE and EL2 for the rest of the mapping
@ManyToOne
@JoinColumnsOrFormulas({ @JoinColumnOrFormula(formula = @JoinFormula(value = "2", referencedColumnName = "ELMLEVEL")),
@JoinColumnOrFormula(column = @JoinColumn(name = "CMPCODE", referencedColumnName = "CMPCODE", insertable = false, updatable = false)),
@JoinColumnOrFormula(column = @JoinColumn(name = "EL2", referencedColumnName = "CODE")) })
private Element element2;
// This on is used to be able to set el2 (because we can't in the property above)
private String el2;
@ManyToOne
@JoinColumnsOrFormulas({ @JoinColumnOrFormula(formula = @JoinFormula(value = "3", referencedColumnName = "ELMLEVEL")),
@JoinColumnOrFormula(column = @JoinColumn(name = "CMPCODE", referencedColumnName = "CMPCODE", insertable = false, updatable = false)),
@JoinColumnOrFormula(column = @JoinColumn(name = "EL3", referencedColumnName = "CODE")) })
private Element element3;
private String el3;
如果我只做一个查询,它就可以正常工作。
如果我使用分页进行查询,生成的查询会引发不明确的列查询。 为什么?
因为单个查询是:
SELECT ID, CMPCODE, ELMLEVEL_1, CMPCODE_1, EL2_1, EL2_1, ELMLEVEL_2, CMPCODE_2, EL3_1, EL3_1 from INVOICE
如您所见,EL2_1 有 2 次,因为它在 2 个属性中,一个是字符串,一个是元素。
对于单个查询,没有问题。
但是现在,我们做一个分页查询:
select * from (SELECT ID, CMPCODE, ELMLEVEL_1, CMPCODE_1, EL2_1, EL2_1, ELMLEVEL_2, CMPCODE_2, EL3_1, EL3_1 from INVOICE) where rownum<10
模棱两可的错误被抛出。
我坚持了 3 天。 我该怎么办?
如果我删除了 el2 字符串,我就不能再更新它了(因为可插入/可更新的错误)。
如果我删除可插入/可更新的 false,我有一个重复的列异常。
注意:我已经简化了模型,但我有 element2 到 element8
【问题讨论】: