OpenJPA отличается

77
8

В моей схеме БД у меня есть разговоры с несколькими письмами. Я хочу получить новейшие электронные письма из списка разговоров. В PostgreSql запрос:

select distinct on (conversation_id) * 
from email
where conversation_id in (7085214, 7084964)
order by conversation_id, processing_date desc

OpenJPA:

(List<Email>) entityManager.createQuery("SELECT
distinct(email.conversation.id), email FROM Email email WHERE
email.conversation.id in :id ORDER BY email.conversation.id,
email.processingDate DESC").setParameter("id", conversationIds);

Он возвращает карту идентификаторов разговора и весь список писем в разговорах.

Как я мог исправить это?

благодаря

спросил(а) 2021-01-25T20:19:53+03:00 4 месяца, 2 недели назад
1
Решение
88

Используйте собственный SQL.

Единственный способ сделать то, что вы хотите, - это разработать патч для OpenJPA, который "учит", как использовать расширение PostgreSQL DISTINCT ON в своем анализаторе и генераторе запросов JPQL. Большинство ORM принимают такие расширения с помощью диалектов. Не ожидайте, что это будет простая задача, хотя, если вы не пишете много таких запросов, родной SQL почти наверняка будет намного проще.

Вы не можете просто использовать функции DISTINCT или DISTINCT ON как аналогичные функции. Это не так; они совершенно отдельный синтаксис. Механизм JPQL попытается преобразовать его в истинный вызов функции, который потерпит неудачу во время выполнения - или, в случае distinct on, просто не сможет проанализировать его в первую очередь.

BTW, DISTINCT ON немного похож на GROUP BY в некоторых других базах данных поставщиков, таких как MySQL, где вам разрешено указывать столбцы в SELECT которые не отображаются в GROUP BY или агрегате. Поэтому в MySQL люди, вероятно, делают это, просто производя технически недействительный запрос, который MySQL принимает в любом случае - вполне вероятно, что обработчик JPJ OpenJPA не заметит проблемы, поэтому он пройдет через штраф. Этот трюк не будет работать для DISTINCT ON и PostgreSQL строго соответствует стандарту GROUP BY, он не позволит вам создавать неопределенный запрос с GROUP BY.

ответил(а) 2021-01-25T20:19:53+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема