【问题标题】:JPA Union Equivelant Need for Adding Constant to Query ResultJPA Union Equivelant 需要在查询结果中添加常量
【发布时间】:2019-03-02 04:29:30
【问题描述】:

我需要 Union 等效项。我知道我们可以通过加入选择来做到这一点,但我无法为查询结果添加常量。这是我的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)添加到没有联合的选择查询的结果中。通过这种方式,我可能能够继续。有什么建议吗?

【问题讨论】:

    标签: java sql jpa querydsl


    【解决方案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
    

    【讨论】:

    • 谢谢,我在另一个问题中看到了您的评论,尝试在此之前实现它,但无法使用 querydsl 完成,因为没有交叉连接选项,我可以不使用交叉连接吗?让我们说内部连接?
    • @cmlonder 。 . .是的。一个简单的方法是inner joinon 1=1
    • 是的,谢谢它有效,但我仍然有同样的问题。让我解释一下-> 我不想使用本机查询,因为我们的应用程序是如此动态,我不想编写特定于数据库的代码等。我仍然不能使用 JPA,虽然没有联合。因为对于这个内部联接 -> INNER JOIN ( SELECT min(SELECTION_NUMBER) AS minid FROM selection.SELECTION) JPA 只让我在 select 和 where 子句中进行内部联接。创建 JPA 代码时我不能使用内部联接。有什么建议吗?
    • @cmlonder 。 . .然后不要在问题上使用 SQL 标记。
    • 如果我们谈论的是 SO 规则,那么为什么要复制/粘贴与我的问题不直接相关的现有解决方案,而不是引用现有问题 url stackoverflow.com/a/23549211/3000280?
    猜你喜欢
    • 2013-09-28
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多