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} ...
我有一个查询,用一个字符串表示:
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} ...