【问题标题】:Hibernate : Pagination query throws an "Ambiguous Column Exception" because of unusual mappingHibernate:由于不寻常的映射,分页查询抛出“不明确的列异常”
【发布时间】: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

【问题讨论】:

    标签: sql hibernate orm


    【解决方案1】:

    我刚刚通过 Hibernate 的一个小“hack”找到了解决方案。 我已将 @JoinColumn 替换为 CMPCODE 以获得完全相同的 @JoinFormula。 但是有了这个,我可以删除第二个元素作为字符串,以及可更新/可插入标志。 Hibernate 似乎对此很满意。

    // 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(formula = @JoinFormula(name = "CMPCODE", referencedColumnName = "CMPCODE", insertable = false, updatable = false)),
                @JoinColumnOrFormula(column = @JoinColumn(name = "EL2", referencedColumnName = "CODE")) })
        private Element element2;
    

    【讨论】: