我有一个数据库,它包含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
调试器映像:正如您在调试器类中看到的,_为空
为什么?
尝试使用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
数据库列的设置器。
另一方面,fetchInto(Table)
始终是最安全的选择,因为从数据库列到字段的映射是在代码生成时静态决定的(您可以自己检查),因此在运行时不会发生任何可能导致映射不起作用的bean/property/事件。
这可能是jOOQ中的一个错误(或缺少的功能)——您应该提交一份票证,等待支持团队。