【问题标题】:JOOQ query to JOIN ON WITH clauseJOOQ 查询到 JOIN ON WITH 子句
【发布时间】:2017-11-12 20:37:54
【问题描述】:

如何编写 JOOQ 查询以从“with”子句加入字段?

例如,我试过:

create.with("a").as(select(
                           val(1).as("x"),
                           val("a").as("y")
                   ))
      .select()
      .from(tableByName("a")
      .join(ANOTHER_TABLE)
          .on(ANOTHER_TABLE.ID.eq(tableByName("a").field("x")))
      .fetch();

但是,由于编译器不知道 tableByName("a").field("x") 的类型,它无法解析使用哪个 eq() 方法。鉴于我知道类型,有没有办法可以明确地提供它?还是我应该采取另一种方法从“with”子句加入字段?

【问题讨论】:

    标签: java sql jooq with-clause


    【解决方案1】:

    先声明 CTE 怎么样? Explicit common table expressions

    CommonTableExpression<Record2<Integer, String>> a =
      name("a").fields("x", "y").as(select(val(1), val("a")));
    
    create.with(a)
          .select()
          .from(a)
          .join(ANOTHER_TABLE)
          .on(ANOTHER_TABLE.ID.eq(a.field("x")))
          .fetch();
    

    如果这不起作用,您始终可以通过Field 获得DataType&lt;?&gt; 或Class&lt;?&gt;,您可以通过Table 获得。

    【讨论】:

    • 谢谢,但这仍然不能帮助编译器解决使用哪个eq() 重载。 Lukas 使用传入类型的 field(Name, Class) 重载的答案可以解决问题。
    【解决方案2】:

    虽然我在这里当然同意flutter's answer being a more desireable path to a solution,但我会快速添加一个回复来回答您的具体编译错误问题。

    您当前的连接谓词存在三处错误:

    ANOTHER_TABLE.ID.eq(tableByName("a").field("x"))
    
    1. DSL.tableByName() 已弃用。一般建议改用table(Name)。
    2. 这种动态构造的Table 不知道它的任何field() 引用,因此table(name("a")).field("x") 将返回null
    3. 编译错误是由于您的ID 引用类型为Field&lt;Integer&gt;(可能),因此Field.eq() 方法也需要Field&lt;Integer&gt; 参数。在不知道您的字段 "x" 的类型的情况下,jOOQ API / Java 编译器会推断出 Field&lt;Object&gt;,这是无效的。

    所以,解决办法是这样写:

    // field(Name, Class)
    ANOTHER_TABLE.ID.eq(field(name("a", "x"), Integer.class))
    
    // field(Name, DataType)
    ANOTHER_TABLE.ID.eq(field(name("a", "x"), ANOTHER_TABLE.ID.getDataType()))
    

    即使用DSL.field(Name, Class&lt;T&gt;),或者DSL.field(Name, DataType&lt;T&gt;),如果您使用的是自定义数据类型绑定/转换器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 2020-10-05
      • 2014-04-20
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2010-11-16
      相关资源
      最近更新 更多