如何用jooq执行任意数量的选择,并用union连接

zhte4eai  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(387)

我要执行联合 List<Select> 喜欢

SELECT #1
UNION
SELECT #2
UNION
...

我怎么能和jooq一起做?
更新:在我的方法中,我检查一组参数,如果它们不是nul,则将子查询添加到列表中。我需要像字符串连接功能。
所以我通过降级到原始sql并使用 Joiner(" UNION ").join(List<String>subqueries)

esyap4oy

esyap4oy1#

也许下面这些可以用来打电话 union 关于几个 Select s。

<T extends Record> Result<T> fetchUnion(List<Select<T>> selects) {
    return selects.stream()
                  .reduce(Select::union)
                  .map(Select::fetch)
                  .orElseThrow(() -> /* your exception? */);
}

请注意,我还没有测试它,您可能需要修改它一点,让它工作。或者:

<T extends Record> Result<T> fetchUnion(Select ... selects) {
   return Stream.of(selects)
                .reduce(Select::union)
                .map(Select::fetch)
                .orElse ... ;
}

一个可能的呼叫可能是:

Result result = fetchUnion(select(T1.A, T1.B).from(T1), 
                           select(T2.A, T2.B).from(T2), 
                           select(T3.A, T3.B).from(T3));

lukas提到的静态导入在这里也是必需的:

import static org.jooq.impl.DSL.*;
kiz8lqtg

kiz8lqtg2#

干得好:

using(configuration)
   .select(T1.A, T1.B)
   .from(T1)
   .union(
    select(T2.A, T2.B)
   .from(T2))
   .union(
    select(T3.A, T3.B)
   .from(T3))
   .fetch();

以上答案假设如下:

import static org.jooq.impl.DSL.*;

相关问题