Я пытаюсь заставить родные запросы работать с InheritanceType.JOINED
. Из документации Hibernate я нашел:
13.1.6. Обработка наследования
Собственные SQL-запросы, которые запрашивают объекты, которые отображаются как часть наследования, должны включать все свойства для базового класса и всех его подклассов.
Использование следующих двух объектов:
@Data
@Entity
@Table(name = "my_super")
@EqualsAndHashCode(of = {"id"})
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class MySuper {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
}
и
@Data
@Entity
@Table(name = "my_sub_a")
@EqualsAndHashCode(callSuper = true)
public class MySubA extends MySuper {
@Column(name = "x")
private int x;
}
Когда я пытаюсь создать собственный запрос, используя:
Object actual = session
.createNativeQuery("SELECT {s.*} FROM my_super {s} LEFT JOIN my_sub_a {a} USING (id)")
.addEntity("s", MySuper.class)
.getSingleResult();
Это переводит на запрос:
SELECT s.id as id1_1_0_, s_1_.x as x1_0_0_, case when s_1_.id is not null then 1 when s.id is not null then 0 end as clazz_0_ FROM my_super s LEFT JOIN my_sub_a a USING (id)
И затем сбой:
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement
Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement
Caused by: org.h2.jdbc.JdbcSQLException: Column "S_1_.X" not found; SQL statement:
Итак, мы наблюдаем, что инъекция псевдонима делает свою работу, выясняя, что ей может понадобиться столбец x
my_sub_a
. Однако он не может найти псевдоним для my_sub_a
. Как мой код должен быть изменен так, чтобы этот псевдоним был правильно подключен?
Мой код доступен в https://gist.github.com/JWGmeligMeyling/51e8a305f3c268eda473511e202f76e8 для легкого воспроизведения моей проблемы.
(Я знаю, что этот запрос может быть легко выражен и в JPQL или HQL, и даже может быть достигнут с помощью API EntityManager
и Session
. Однако я хочу использовать это в более сложном запросе, что я упростил все детали, необходимые для этого вопроса).