我有一个包含表PLAYERS_APPEARANCE的数据库,其中有一个名为“Class”的字段。
我正在跟jooq一样查询
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);
PlayersAppearance.class是由jooq生成的POJO。对于Class字段,它在java中生成 class _ 字段,并使用 getClass _()方法访问它。 class_被命名以避免与本机方法getClass()冲突,但它也以某种方式打破了数据库字段值
问题
PlayersApperance pa = pa.getClass_()返回NPE
Debugger image: As you can see in the debugger class_ is null
为什么?
答案 0 :(得分: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依赖于反射来完成它的工作,似乎没有指示使用setClass_()
作为CLASS
数据库列的setter。
另一方面,fetchInto(Table)
始终是最安全的选择,因为从数据库列到字段的映射是在代码生成时静态决定的(您可以自己检查),因此没有bean / property /在运行时可以使映射不起作用。
这可能是jOOQ中的一个错误(或缺少的功能) - 您应该提交一张票并等待支持团队。