Hibernate и querydsl выбирают унаследованные значения - PullRequest
0 голосов
/ 24 марта 2020

Со следующими объектами:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Parent {
    @Id
    private Long id;
}
@Entity
public class ChildOne extends Parent {
    private String label;
    private String propertyOne;
}
@Entity
public class ChildTwo extends Parent {
    private String label;
    private String propertyTwo;
}
@Entity
public class ChildThree extends Parent {
    private String specialLabel;
}

Я выполняю следующий запрос querydsl:

        QParent parent = QParent.parent;

        JPAQuery<Tuple> query = new JPAQuery<>(em)
            .select(
                parent.as(QChildOne.class).label,
                parent.as(QChildOne.class).propertyOne,
                parent.as(QChildTwo.class).label,
                parent.as(QChildTwo.class).propertyTwo,
                parent.as(QChildThree.class).specialLabel
                )
            .from(parent);

        List<Tuple> result = query.fetch();

Ожидаю следующий результат

| label1 | prop1 | null   | null  | null   |
| null   | null  | label2 | prop2 | null   |
| null   | null  | null   | null  | label3 |

однако сгенерированный запрос смешивает поля с одинаковыми именами (в данном случае label).

Вот запрос, сгенерированный Hibernate:

select parent0_1_.label         as col_0_0_,
       parent0_1_.property_one  as col_1_0_,
       parent0_1_.label         as col_2_0_,
       parent0_3_.property_two  as col_3_0_,
       parent0_2_.special_label as col_4_0_
from parent parent0_
         left outer join child_one parent0_1_ on parent0_.id = parent0_1_.id
         left outer join child_three parent0_2_ on parent0_.id = parent0_2_.id
         left outer join child_two parent0_3_ on parent0_.id = parent0_3_.id

Как видите, псевдонимы, используемые в select, не соответствуют ожидаемым.

Есть ли способ указать, что я хочу, чтобы первая метка исходила от объекта child1, а вторая - от объект child2?

...