HQL Fetch Join, не зная реализации объекта - PullRequest
0 голосов
/ 24 апреля 2020

У меня проблемы с производительностью, и я пытаюсь добавить соединение извлечения, чтобы получить данные только в одном запросе.

Моя проблема: я получил сопоставленный объект AbstractObject. И у меня также есть другой сопоставленный объект, такой как ObjectA, ObjectB et c ... все расширяются AbstractObject.

В моем ObjectA я получил список foos. В моем ObjectB я получил список otherFoos.

Что я пытаюсь сделать: я хочу написать запрос так:

entityManager.createQuery("SELECT ao FROM AbstractObject ao LEFT JOIN FETCH ao.foos LEFT JOIN FETCH ao.otherFoos WHERE ao.id = ?1", AbstractObject.class)

Проблема: я получил nullPointerException, потому что, я думаю, hibernate не знает foos или otherFoos для AbstractObject. С моей точки зрения, я не знаю, будет ли у меня ObjectA или ObjectB.

Кто-нибудь знает решение этой проблемы?

Hibernate версия: 5.0.12 .Final

1 Ответ

1 голос
/ 01 мая 2020

В общем случае, чтобы выполнить запрос HQL и вернуть свойства нескольких сущностей для одного и того же результата, требуется проекция на DTO.

Таким образом, вы создадите DTO, например, ObjectAB, который не будет отображен, вероятно, он будет расширять оба объекта A и B, а затем вы создадите свой запрос и установите преобразователь результата в это DTO.

В качестве альтернативы вы можете использовать кортеж вместо DTO, но это не меняет основной идеи. Для более подробной информации об этой методологии вы можете прочитать эту статью .

...