我有一个查询,用字符串表示:
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>
实例(我猜),但我找不到如何做到这一点。
答案 0 :(得分:2)
您可以在多种地方注入Select
类型plain SQL。例如:
<context>.select()
.from(DSL.table("person"))
.where(
"identifier in ({0})", DSL.resultQuery(q)
)
.fetch();
<context>.select()
.from(DSL.table("person"))
.where(DSL.field("identifier").in(
DSL.select().from("(" + q + ")")
))
.fetch();
还有其他人。需要注意的重要一点是,通过使用纯SQL,您可以将自己的SQL字符串嵌入到具有枚举占位符的模板中
... {0} ... {1} ...