首页 > 解决方案 > JPA Union 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;

此查询需要查找列的最小未使用整数。让我们说:

示例_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)添加到没有联合的选择查询的结果中。通过这种方式,我可能能够继续。有什么建议吗?

标签: javasqljpaquerydsl

解决方案


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

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

推荐阅读