JPA Union Equivelant Потребность в добавлении константы к результату запроса - PullRequest
0 голосов
/ 26 сентября 2018

Мне нужен союз Equivelant для Союза.Я знаю, что мы можем сделать это, соединяя выборки, но я не мог сделать это для добавления константы в результаты запроса.Вот мой sql

SELECT MIN(t1.EXAMPLE_NUMBER)
FROM
     (
     SELECT 1 AS EXAMPLE_NUMBER
     UNION ALL
     SELECT EXAMPLE_NUMBER + 1
     FROM selection.SELECTION
     ) t1
LEFT OUTER JOIN selection.SELECTION t2
ON t1.EXAMPLE_NUMBER = t2.EXAMPLE_NUMBER
WHERE t2.EXAMPLE_NUMBER IS NULL;

Этот запрос нужен для поиска минимального неиспользуемого целого числа для столбца.Скажем:

EXAMPLE_NUMBER

1

4

5

Мне нужно получить 2 в результате для этого случая.Это sql для этого.Итак, вот мой вопрос:

Я использую QueryDsl-JPA для этого.С JPA 2 я не могу использовать UNION.Так что я не могу сделать этот sql с querydsl-jpa, я думал о идти так:

JPAQuery baseQuery = new JPAQuery(em);

SubQueryExpression handleNumberOne = baseQuery.select(Expressions.constant(1));
SubQueryExpression selectAvailableMinNumber = baseQuery.select(selection.exampleNumber.add(1)).from(selection);

baseQuery.union (handleNumberOne, selectAvailableMinNumber);// НЕТ СОЮЗА В НАЛИЧИИ

Есть ли доступный способ сделать это с помощью querydsl-JPA?Я не хочу включать библиотеку querydsl-sql просто по этой причине, я ищу решение в стиле JPA.То, что я пытался так, чтобы попытаться добавить константу (1 в моем случае) к результату запроса выбора без объединения.Таким образом, я могу продолжить.Любое предложение?

1 Ответ

0 голосов
/ 26 сентября 2018

Вам не нужно генерировать все числа, чтобы получить эту информацию.

Для всех чисел, кроме 1, вы можете сделать:

select s.example_number + 1
from selection s
where not exists (select 1
                  from selection s2
                  where s2.example_number = s.example_number + 1
                 )
fetch first 1 row only;   -- or limit 1

Если вы также хотите получить "1«если его не существует, то:

select (case when min_en > 1 then 1
             else s.example_number + 1
        end)
from selection s cross join
     (select min(example_number) as min_en from selection) mins
where not exists (select 1
                  from selection s2
                  where s2.example_number = s.example_number + 1
                 )
fetch first 1 row only;   -- or limit 1
...