【问题标题】:jooq - execute string as subqueryjooq - 将字符串作为子查询执行
【发布时间】:2015-02-03 00:12:19
【问题描述】:

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

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

【问题讨论】:

  • 这不会有什么不同;即使这是纯 jooq,也会执行一个子查询。
  • 是的,但是子查询的中间结果不会被发送到客户端并返回到服务器(用于执行外部查询)。

标签: java sql subquery jooq


【解决方案1】:

有很多地方可以将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} ...

【讨论】:

  • 谢谢,非常有用。没有添加in(String, QueryPart...) 函数的情况吗?我没有找到第一个解决方案,因为我们没有使用 in() 函数。我也找不到第二种解决方案,因为我们是selecting from a select statement。不过,这有点迂腐。
  • 或者更好,像这样:.in(DSL.query("..."))
  • @JefJedrison: in(String, QueryPart...) 是不可能的,因为它会与in(T...) 冲突,尤其是在您将&lt;T&gt; 绑定到Object 的情况下。 “我没有找到第一个解决方案,因为我们没有使用 in() 函数” - 好吧,我只能回答您提出的问题,而不是您想到的问题 :) . “我也没有找到第二种解决方案,因为我们是从 select 语句中选择的” - 我同意这不是最佳的。 “或者甚至更好,像这样:.in(DSL.query("..."))” 以这种方式创建 Select&lt;Record1&lt;T&gt;&gt; 没有精简的方法
  • @JefJedrison:不客气。我同意您的用例还有改进的空间,但是 Stack Overflow cmets 讨论这些事情有点棘手。也许,我们继续在jOOQ User Group 上讨论这个?
  • 我同意我们不应该讨论 SO。我将在本周晚些时候将自己注册到邮件列表中。感谢您一直以来的支持!
猜你喜欢
  • 2019-12-21
  • 2011-04-15
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多