2017-06-11 23 views
1

"with"句のフィールドに結合するJOOQクエリを作成するにはどうすればよいですか?JOOQ WITH 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")フィールド( "X")を知らないと、それがどのEQ(解決することはできません。 )メソッドを使用します。私がタイプを知っていることを考えると、それを明示的に提供する方法はありますか?あるいは、「with」節からフィールドに参加するために取るべき別のアプローチがありますか?

答えて

1

私は確かにflutter's answer being a more desireable path to a solutionに同意しますが、私はあなたの特定のコンパイルエラーの質問に答える応答をすぐに追加します。

ANOTHER_TABLE.ID.eq(tableByName("a").field("x")) 
  1. DSL.tableByName()が廃止されました:

    は、現在の参加述語と間違っている3つのことをあります。代わりにtable(Name)を使用することをお勧めします。

  2. このような動的にfield()参照のいずれかを知りませんTableを構築し、これtable(name("a")).field("x")はタイプField<Integer>(おそらく)のごID参照されることにコンパイルエラーが原因であるnull
  3. 戻りますので、Field.eq()方法は想定していField<Integer>引数も同様です。フィールド"x"のタイプについての知識がなければ、jOOQ API/JavaコンパイラはField<Object>を推測しますが、これは無効です。

ので、解決策を書くために次のようになります。

// 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<T>)DSL.field(Name, DataType<T>)を使用します。

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(); 

これが機能しない場合、あなたは常にあなたがTable経由で取得することができ、Field経由DataType<?>またはClass<?>を得ることができます。

+0

ありがとうございますが、これはコンパイラが使用する 'eq()'オーバーロードを解決するのに役立ちません。型が渡されるフィールド(名前、クラス)のオーバーロードを使用するというルーカスの答えは、そのトリックを行います。 – eoinmullan