2017-01-02 18 views
2

同じ(a_row_id誤ったフィールド

ここで、Bとのを取得します。実行して、は:

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

私が参加し、私は(この時点で)私が探しているどちらかわからないので、Bの両方を超えるとC

しかし、私は私がBを取得し、これを実行する必要があります知っている:

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

私はrecord.field(Tables.B.A_ROW_ID).toString()をすれば、私は"b.a_row_id"を取得し、私はrecord.getValue(Tables.B.A_ROW_ID)をすれば、私は期待値を取得した上でRecordを取得。

しかし、私が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"ではなく)。

これに関するお手伝いがあれば幸いです。

答えて

1

Record.field(Field)Record.field(Name)のセマンティクス、及びRecord.field(String)はすべて同じ、一貫性のあるロジックは、次のとおりです。、SQLで

をレコードの列には名前があります。この名前は、テーブル/ビュー(カタログ内のスキーマ内)から生成されたものであれば修飾できますが、これはオプションです。限定されていない列も完全に正確です。とき:

  • は場合に、このようなJOIN .. USINGを使用してcol + 1
  • として表現し、作成列
  • を、エイリアシングその列は
  • テーブル名を有することができる派生テーブルを(使用して修飾されていないが、確かスキーマ/カタログではありません)
  • SELECT *PIVOT,MODELMATCH_RECOGNIZEのようなベンダー固有の列発光演算子で使用します。

あなたは、資格の列名を持つ、構文の観点から、見ることができるように例外ではなく、ルールです。このように、Record.field(Field)の最も合理的かつ一般的に有用な実装は、以下のとおりです。

  • がレコード(完全修飾列名)それが失敗した場合
  • の内部正確一致を検索し、内部おおよそ一致を見つけます
      :次に、それがある場合、レコード(修飾されていない列名)
    • 「曖昧」(トップレベルの選択は、そのような曖昧さを可能にするため)、の

jOOQ 3.8+ logs a warning
  • jOOQ 4.0+ will throw an exceptionだから、あなたが観測されてきた行動は正しいです。

  • 1

    ルーカスはすでに主な質問に答えていましたが、私は最後に、jOOQがSQL文を実行していることに気付きました。セキュリティとキャッシングのために縛られていますが、それでもSQLステートメントです。ロギングを有効にすると、SQL自体が表示されます。
    動的レコードを返すのが好きで、列をXにしたい場合は、データを読みやすくするために常に.as( "X")を使用できます。