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

jooq - execute string as subquery

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

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> 实例(我猜),但我找不到如何做到这一点。

有很多地方可以将 Select 类型注入为 plain SQL。例如:

作为普通的 SQL WHERE 子句:

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

作为一个普通的 SQL Table:

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

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

的模板中
... {0} ... {1} ...