Добавлены атрибуты ассоциация один-ко-многим.
Все три сущности унаследованы от Activity. Стратегия single table. Проблема заключается в том, что при формировании sql не учитывается тип сущности атрибута (дискриминатор).
Добавлены атрибуты ассоциация один-ко-многим.
Все три сущности унаследованы от Activity. Стратегия single table. Проблема заключается в том, что при формировании sql не учитывается тип сущности атрибута (дискриминатор).
Сделайте пожалуйста тестовый проект. Это сэкономит нам время на моделирование возможно несуществующей проблемы.
Да, Константин, вы как обычно правы. Имея одну проблему, я ошибочно экстраполировал ее.
Вот проект. Базу оставил внутри.
С датасорсами все хорошо:
А вот при выполнении такого запроса к БД;
select act1, act2 from inherit$Activity1 act1 left join act1.activities2 act2
Я получаю следующий результат:
Рассчитываю я получить одну строку. Да и собственно сущность с ид f42b3386-d3da-693d-4f61-4a28a316a346
не является экземпляром Activity2 (она Activity3).
Возможно я неправильно использую jpql…
inherit.7z (143,1 КБ)
EclipseLink ORM не может в данном случае корректно обработать запрос JPQL, поскольку используется одно и тоже mappedProperty
для двух разных коллекций, да и сущности все используют SINGLE_TABLE
стратегию наследования. Решить данную проблему каким то фиксом в платформе или EclipseLink не получится.
Единственно возможное решение это указывать тип напрямую в JPQL запросе:
select act1, act2 from inherit$Activity1 act1 left join act1.activities2 act2 where TYPE(act2) = inherit$Activity2
Андрей, а так допустимо? В документации написано, что не должно работать.
Если будет другой тип наследования, будет работать корректно?
Да, должно работать. Я проверил запрос.
Я думаю будет работать. Основная проблема в том, что все данные лежат в одной таблице и EclipseLink не добавляет в запрос условия по дискриминанту