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

Java jooq-将字符串作为子查询执行,java,sql,subquery,jooq,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.fiel

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

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());
System.out.println(.select().from(DSL.table(“person”))。其中(DSL.field(“identifier”)。in(
.fetch(q).intoArray(0)
)).fetch());
这里的问题是,我实际上在执行两个查询。这会引入开销


是否可以将字符串查询作为实子查询执行?我不得不将字符串查询转换为
Select
实例(我猜),但我找不到如何做。

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

作为普通SQL WHERE子句:
那没什么区别;即使这是纯jooq,也会执行子查询。是的,但是子查询的中间结果不会发送到客户端并返回到服务器(用于执行外部查询)。谢谢,非常有用。在(String,QueryPart…)函数中添加
不是很有必要吗?我没有找到第一个解决方案,因为我们没有在()中使用
in
函数。我也找不到第二种解决方案,因为我们正在从select语句中进行选择。这是迂腐的。或者更好的是,像这样:
.in(DSL.query(“…”)
@JefJedrison:
in(String,QueryPart…)
是不可能的,因为它会与(T…)
中的
冲突,尤其是在您将
绑定到
对象的情况下。“我没有找到第一个解决方案,因为我们没有使用in()函数”-嗯,我只能回答您提出的问题,而不是您想回答的问题:)。“我也没有发现第二种解决方案,因为我们是从select语句中选择的”-我同意这不是最优的。甚至更好的是,类似这样的东西:((DSL.query(“…”)中)没有创建
Select
this的简单方法way@JefJedrison:不客气。我同意您的用例还有改进的余地,但是堆栈溢出注释在讨论这些问题时有点棘手。也许,我们继续在网上讨论这个问题?我同意我们不应该这样讨论。我将在本周晚些时候注册到邮件列表中。谢谢你的支持!
<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();