Есть ли способ сослаться на столбец подзапроса HQL? - PullRequest
0 голосов
/ 19 февраля 2019

Я бы хотел выполнить HQL-запрос (через @Query Spring Data), который выбирает из message записи, которые имеют значение в поле a, соответствующее значению последнего сообщения, а также соответствуют определенным условиям в других полях.

Наиболее очевидный подход, как я вижу, состоит в том, чтобы использовать подзапрос, который максимизирует записи по полю createTime, группирует их по a и затем обращается к этому столбцу из подзапроса.Тем не менее, я не могу создать HQL, который будет компилироваться.Есть ли способ сослаться на столбцы подзапроса, или я должен попробовать другой подход для решения этой проблемы?

Выражение HQL, которое я пытался использовать:

select m from Message m where m.a = (
    select m2.a, max(m2.createTime) from Message m2
    where ... (additional conditions)
).a

К сожалению, оно бросило java.lang.NullPointerException во время компиляции.

1 Ответ

0 голосов
/ 19 февраля 2019

Это типичный запрос N для каждой категории (где N = 1 в вашем случае):

SELECT m
FROM Message m 
WHERE NOT EXISTS (
  FROM Message m2
  WHERE m2.a = m.a
  AND m2.createTime > m.createTime
)

Другими словами, найдите все сообщения, для которых не существует более свежих сообщений вта же «категория» m.a.

К сожалению, HQL, по-видимому, не предлагает гораздо лучший подход, чем самозащита при присоединении к таблице сообщений, которая, скорее всего, приведет к плохой производительности для больших таблиц,даже с индексом на (a, create_time).Если это окажется проблемой, вы все равно можете попробовать решение SQL.В зависимости от вашей СУБД вы сможете сделать это с помощью одного доступа к таблице сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...