Рефакторинг собственного запроса в JPQL-запрос - PullRequest
0 голосов
/ 10 октября 2018

Предположим, у нас есть следующая таблица, называемая 'документами':

id | createDate | createBy | updateDate | updateBy
--------------------------------------------------
(various rows here)

два * столбца даты являются временными метками, а все остальные являются строками (даже id)

В настоящее время у меня есть следующий собственный запрос, используемый в репозитории Spring:

select COUNT(distinct(u.user_working_total)) 
     from
(
    select distinct(createBy) user_working_total
    from documents
    where createDate >= :startDate and 
    createDate <= :endDate

    union

    select distinct(updateBy) user_working_total
    from documents
    where updateDate >= :startDate and 
    updateDate <= :endDate
) as u

Как вы можете видеть, он должен использоваться как собственный запрос, поскольку JPA не поддерживает запрос выбора в предложении from.Теперь мне нужно преобразовать этот запрос в JPQL-запрос, чтобы сделать его независимым от базы данных.Возможно ли это как-то?Приветствуются другие подходы, такие как использование спецификации или аналогичный ...

1 Ответ

0 голосов
/ 11 октября 2018

Вы заявляете, что

хотите иметь независимый от базы данных запрос.

Я думаю, у вас уже может быть такой запрос.

Оператор SQL довольно прост, и хотя я не претендую на то, что знаю каждый диалект SQL, я бы ожидал, что он будет работать со многими базами данных, вполне возможно, со всеми, что имеет отношение.

Поэтому моя основная рекомендация - настроить тесты для тестирования всех баз данных, которые вам нужно поддерживать, и проверить, работает ли он.

Если вы настаиваете на использовании JPQL, может сработать следующее:

Добавьте сущность / таблицу Two с одним столбцом (id) и двумя записями: 1 и 2.

. Вы можете построить свой запрос следующим образом:

select
    count(distinct coalesce(t.id, 1, d.createDate, 2, d.updateDate))
from Documents d, Two t
where (t.id = 1
    and d.createDate >= :startDate 
    and d.createDate <= :endDate)
or (t.id = 2
    and d.updateDate >= :startDate 
    and d.updateDate <= :endDate)

Не уверен, поддерживается ли count( function(x)) или нет .

...