我需要工会的工会对等。我知道我们可以通过加入选择来做到这一点,但是我无法为查询结果添加常量。这是我的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;
此查询需要查找该列的最小未使用整数。可以说:
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)添加到没有联合的选择查询的结果而尝试了什么。这样,我也许可以继续。有什么建议吗?
答案 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