2017-01-02 41 views
2

我有3个表ABC这是一个继承链的一部分:误区场jOOQ记录

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

现在,我取Record s的BC做:

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仅使用表(而不是完全合格的“table.field_name”)的FIELD_NAME,如果这是在连接的唯一表?

任何帮助,将不胜感激。

回答

1

Record.field(Field)Record.field(Name),并且Record.field(String)所有的语义遵循相同的,一致的逻辑:

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

  • 混叠柱
  • 创建表达式,如col + 1
  • 使用JOIN .. USING,万一列不合格
  • 使用派生表(其可以有一个表的名称,但当然不是模式/目录)
  • 使用SELECT *与供应商特定的列发射运算符如PIVOT,MODEL,MATCH_RECOGNIZE
  • 等等

正如你可以看到,从语法的角度来看,有合格的列名是例外,而不是规则。因此,最合理,最普遍有用的实施Record.field(Field)是:

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

1

Lukas已经回答了主要问题,但我只是想告诉你,最后jOOQ正在运行一个SQL语句。它的安全和缓存是有限的,但它仍然是一个SQL语句。如果你打开日志记录,你可以看到SQL本身。
如果您希望返回一个动态记录,并且希望列为X,则始终可以执行.as(“X”),以便更容易地读取数据。