jooq - 将字符串作为子查询执行

时间:2015-02-02 14:33:24

标签: java sql subquery jooq

我有一个查询,用字符串表示:

final String q = "select 1 union select 2 union select 3";

此字符串来自外部源(配置),因此它是一个字符串。在真实场景中,查询更有意义。

我想在jOOQ类型安全查询中将此查询作为子查询执行。以下工作,但它不是我想要的:

    System.out.println(<context>.select().from(DSL.table("person")).where(DSL.field("identifier").in(
            <context>.fetch(q).intoArray(0)
    )).fetch());

这里的问题是我实际上是在执行两个查询。这引入了开销。

是否可以将字符串查询作为真正的子查询执行?我不知何故必须将字符串查询转换为Select<Record1>实例(我猜),但我找不到如何做到这一点。

1 个答案:

答案 0 :(得分:2)

您可以在多种地方注入Select类型plain SQL。例如:

作为纯SQL WHERE子句:

<context>.select()
         .from(DSL.table("person"))
         .where(
             "identifier in ({0})", DSL.resultQuery(q)
         )
         .fetch();

作为普通的SQL表:

<context>.select()
         .from(DSL.table("person"))
         .where(DSL.field("identifier").in(
             DSL.select().from("(" + q + ")")
         ))
         .fetch();

还有其他人。需要注意的重要一点是,通过使用纯SQL,您可以将自己的SQL字符串嵌入到具有枚举占位符的模板中

... {0} ... {1} ...