jOOQ动态的WITH子句数

问题描述 投票:1回答:1

我在玩jOOQ和嵌套查询。我有一个JSON有效载荷,其中可能包含许多子查询。我想将这些子查询视为数量可变的通用表表达式(即WITH子句中的CTE)。目前我有这个工作示例,但它所包含的CTE数量是静态的。我如何在WITH子句中实现CTE的可变数量?

    /*
    +-----------------+
    |sum_of_everything|
    +-----------------+
    |              100|
    +-----------------+
     */
    Supplier<Stream<Map<String, Object>>> resultsWith =
        () ->
            dslContext
                .with("s1")
                .as(query)
                .select(sum(field("1", Integer.class)).as("sum_of_everything"))
                .from(table(name("s1")))
                .fetchStream()
                .map(Record::intoMap);

最终,我需要对JSON有效载荷进行反序列化,以确保CTE引用层次结构的正确工作,我需要查看 jOOQ 支持在选择最终结果之前,在另一个CTE中引用一个CTE。我需要完成这样的事情。


    /*
    +-----------------+
    |sum_of_everything|
    +-----------------+
    |              100|
    +-----------------+
     */
    Supplier<Stream<Map<String, Object>>> resultsWith =
        () ->
            dslContext
                .with("s1").as(query1)
                .with("s2").as(query2) // should be able to reference "s1" i.e. query1
                ...
                .with("sNMinus1").as(queryNMinus1)
                .with("sN").as(queryN) // should be able to reference any upstream CTE
                .select(sum(field("1", Integer.class)).as("sum_of_everything"))
                .from(table(name("sN")))
                .fetchStream()
                .map(Record::intoMap);
java postgresql common-table-expression jooq
1个回答
1
投票

你可以创建一个 CommonTableExpression 起步 Name,使用 Name.as(Select) 例如

CommonTableExpression<?> s1 = name("s1").as(query1);
CommonTableExpression<?> s2 = name("s2").as(query2);

// And then (or, of course, use a Collection)
dslContext.with(s1, s2, ..., SN)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.