在查询结果中添加常量的JPA Union Equivelant需求

时间:2018-09-26 11:45:09

标签: java sql jpa querydsl

我需要工会的工会对等。我知道我们可以通过加入选择来做到这一点,但是我无法为查询结果添加常量。这是我的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。因此,我无法使用querydsl-jpa来执行此sql,我正在考虑采用这种方式:

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 :(得分:0)

您不必生成所有数字即可获取此信息。

对于除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