2016-04-02 4 views
0

"PLAYERS_APPEARANCE"というテーブルがあり、 "Class"という名前のフィールドがあるデータベースがあります。データベースの "class"フィールド

私はPlayersAppearance.classがjooqによって生成されたPOJOであるので

PlayersAppearance pp = getCtx().select(PLAYERS_APPEARANCE.RACE,PLAYERS_APPEARANCE.CLASS,PLAYERS_APPEARANCE.GENDER). 
    from(PLAYERS_APPEARANCE).where(PLAYERS_APPEARANCE.ID.equal(id)).fetchInto(PlayersAppearance.class).get(0); 

のようなjooqに照会しています。クラスフィールドの場合はclass_フィールドをJavaで生成し、getClass_()メソッドでアクセスします。 class_が、ネイティブメソッドはgetClass()との競合を避けるために名前を付けられますが、それはまた、データベースのフィールドの値を壊している何とか

問題

PlayersApperance PA = pa.getClass_()を返すNPE

Debugger image: As you can see in the debugger class_ is null

なぜですか?

+0

すべてのフィールドは、デバッガ画面ではnullでも、idですらありません。あなたはデータベースからそのレコードを全く読んでいません – Raffaele

+0

私は、レース、ジェンダー、そしてクラスの3つのフィールドだけを読みました。クラスフィールドは空の1つだけです –

+0

[jOOQ logging](http://www.jooq.org/doc/3.1/manual/sql-execution/logging/)を有効にして何が起こるかを確認してください – Raffaele

答えて

0

fetchInto(Table)代わりfetchInto(Class)で使用してみてください:

PlayersAppearance pa = ctx 
    .select(PLAYERS_APPEARANCE.RACE 
     , PLAYERS_APPEARANCE.CLASS 
     , PLAYERS_APPEARANCE.GENDER) 
    .from(PLAYERS_APPEARANCE) 
    .where(PLAYERS_APPEARANCE.ID.eq(id)) 
    .fetchInto(PLAYERS_APPEARANCE) 

たぶんJavaのジェネレータは、フィールド名に下線を付加しますが、fetchInto(Class) APIは、その仕事をするためにリフレクションに依存している、そしてするように指示いないようですCLASSデータベース列の設定者としてsetClass_()を使用してください。

データベースの列からフィールドへのマッピングがコード生成時に静的に決定されるため(あなた自身で確認できます)、実行時に発生するBean/Property /何も発生しないため、常に安全な選択です。マッピングが機能しないようにします。

これはjOOQのバグ(または欠落した機能)である可能性があります。チケットを発行してサポートチームを待つ必要があります。

+0

答えに感謝します! –

+0

本当にバグです:https://github.com/jOOQ/jOOQ/issues/4867 –

関連する問題