Hibernate: запрос разбивки на страницы выдает «исключение неоднозначного столбца» из-за необычного отображения - PullRequest
0 голосов
/ 19 мая 2019

Я работаю над проектом, и у меня есть «странное» отображение для управления. Неважно, это структура:

  • Элемент состоит из одного FK, состоящего из cmpcode, elmlevel и code

  • Счет состоит из cmpcode, element2 (который является элементом уровня 2, с тем же самым cmpcode), element3 (который является элементом уровня 3, с тем же самым cmpcode)

Таким образом, таблица INVOICE имеет 4 столбца

  • ID

  • CMPCODE

  • EL2 (код элемента уровня 2 с тем же CMPCODE)

  • EL3 (код элемента уровня 3 с тем же CMPCODE)

Мое сопоставление для класса 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).

Если я удаляю вставляемое / обновляемое значение false, у меня возникает повторное исключение столбца.

Примечание: я упростил модель, но у меня есть element2 к element8

1 Ответ

0 голосов
/ 19 мая 2019

Я только что нашел решение с небольшим "взломом" Hibernate. Я заменил @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;
...