【问题标题】:Erroneous Field in jOOQ RecordjOOQ 记录中的错误字段
【发布时间】:2017-01-05 01:24:08
【问题描述】:

我有 3 个表 ABC,它们是继承链的一部分:

  A
 / \
B   C

看起来像:

A(row_id)
B(row_id, a_row_id REFERENCES A(row_id))
C(row_id, a_row_id REFERENCES A(row_id))

注意列名是一样的(a_row_id

现在,我通过以下方式获取BC 中的Records:

ctx.select()
    .from(
        Tables.A
        .leftOuterJoin(Tables.B).onKey()
        .leftOuterJoin(Tables.C).onKey()
    )
    .where(someCondition)
    .fetch()

我加入了BC,因为我(此时)不知道我在寻找哪一个。

但是,当我知道我需要获取 B 并执行以下操作时:

ctx.select()
    .from(
        Tables.A
        .leftOuterJoin(Tables.B).onKey()
    )
    .where(someCondition)
    .fetch()

我得到一个Record,如果我执行record.field(Tables.B.A_ROW_ID).toString(),我得到"b.a_row_id",如果我执行record.getValue(Tables.B.A_ROW_ID),我得到预期值。

但是,如果我执行record.field(Tables.C.A_ROW_ID).toString(),我会得到"b.a_row_id",而record.getValue(Tables.C.A_ROW_ID) 会得到record.getValue(Tables.B.A_ROW_ID) 的预期值。

我认为这是因为引用父表的列名相同。

jOOQ 是否仅使用表的 field_name(而不是完全限定的“table.field_name”),如果这是连接中唯一的表?

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    Record.field(Field)Record.field(Name)Record.field(String) 的语义都遵循相同、一致的逻辑:

    在 SQL 中,记录的列有一个名称。如果该名称源自表/视图(在模式中(在目录中)),则可以限定该名称,但这是可选的。不合格的列也很好,例如什么时候:

    • 别名列
    • 创建表达式,例如col + 1
    • 使用JOIN .. USING,以防哪些列不合格
    • 使用派生表(可能有表名,但肯定不是架构/目录)
    • SELECT * 与特定于供应商的列发射运算符一起使用,例如PIVOTMODELMATCH_RECOGNIZE

    如您所见,从语法的角度来看,具有限定的列名是例外,而不是规则。因此,Record.field(Field) 的最合理和普遍有用的实现是:

    所以,你观察到的行为是正确的。

    【讨论】:

      【解决方案2】:

      Lukas 已经回答了主要问题,但我只是想提醒您,jOOQ 最终运行的是 SQL 语句。它受限于安全性和缓存,但它仍然是一条 SQL 语句。如果您打开日志记录,您可以看到 SQL 本身。
      如果您喜欢返回动态记录并且希望列为 X,您可以随时执行 .as("X") 以更轻松地读取数据。

      【讨论】:

        猜你喜欢
        • 2019-04-13
        • 2021-03-09
        • 2021-12-10
        • 2018-11-11
        • 2016-10-26
        • 2018-05-20
        • 1970-01-01
        • 2020-05-30
        • 1970-01-01
        相关资源
        最近更新 更多