java - 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)添加到没有联合的选择查询的结果中。通过这种方式,我可能能够继续。有什么建议吗?
解决方案
您不必生成所有数字来获取此信息。
对于除 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
推荐阅读
- css - 如何解决在角度材料的多选中选择所有值的问题?
- android - 在android中重命名文件
- python - 如何在人脸识别的KNN算法中获取匹配图像的百分比
- node.js - 如何确保一个异步功能在另一个异步功能在 NodeJS 中启动之前完成?
- sql - 使用 UUID 列设置大查询表?
- c++ - 从自定义 wxButton 中删除边框
- python-3.x - 将 tensorflow.keras 模型转换为 keras 模型
- javascript - 一旦手势开始,即使我向其添加偏移值,PanGestureHandler translationY 也会重置为 0。这怎么可能?
- mysql - MySQL 在 XAMPP(v3.2.4) 中意外关闭,而 Apache 工作正常
- reactjs - 如何做 Storybook React Material UI 自定义样式