Postgresql 将jooq记录映射到对象时获取空指针异常
我有两个JOOQ存储库,它们从postgresdb获取数据,并将数据作为值对象提供。我使用的是JOOQ3.10.7,一切正常。我已将spring boot版本从2.0.3升级到2.1.4,后者将JOOQ版本升级到3.11.10。在映射Jooq记录时,我开始获取NullPointerExceptionPostgresql 将jooq记录映射到对象时获取空指针异常,postgresql,spring-boot,jooq,Postgresql,Spring Boot,Jooq,我有两个JOOQ存储库,它们从postgresdb获取数据,并将数据作为值对象提供。我使用的是JOOQ3.10.7,一切正常。我已将spring boot版本从2.0.3升级到2.1.4,后者将JOOQ版本升级到3.11.10。在映射Jooq记录时,我开始获取NullPointerException try { record = jooq.build() .select(user.name) .where(user.id.eq
try {
record = jooq.build()
.select(user.name)
.where(user.id.eq(1))
.fetchSingle();
} catch (NoDataFoundException e) {
return null;
}
return record.into(String.class);
在上述场景中,当没有与给定条件(user.id.eq(1))匹配的记录时,fetchSingle必须抛出NoDataFoundException。但根据我的观察,这并不是抛出异常,而是返回一个记录对象,其字段为(user.name),值为“null”。这是意料之中的事吗?我尝试使用fetchOne().into(String.class)
但同样的问题仍然存在
这是我的JOOQ配置类
public class JooQJdbcImpl implements Jooq {
private final Settings defaultSettings = new Settings()
.withRenderNameStyle(RenderNameStyle.AS_IS);
private final RecordMapperProvider recordMapperProvider = new DefaultRecordMapperProvider();
@Autowired
DataSource dataSource;
@Override
public DSLContext build() {
return withSettings(defaultSettings);
}
@Override
public DSLContext withSettings(Settings settings) {
final Configuration configuration = new DefaultConfiguration()
.set(SQLDialect.POSTGRES_9_5)
.set(dataSource)
.set(recordMapperProvider)
.set(settings);
return DSL.using(configuration);
}
}一般来说,您可以使用,当找不到记录时,它可以防止NPE
但根据我的观察,这并不是抛出异常,而是返回一个记录对象,其字段为(user.name),值为“null”。这是意料之中的事吗
是的,这是意料之中的。当您将调用到(String.class)
中时,这将试图找到最合适的字符串
构造函数,并使用String参数调用它,在这种情况下,您实际上是在调用新字符串(null)
,这是不可能的
不过,你不必依赖这种行为。只要打电话:
return jooq.build()
.select(user.name)
.where(user.id.eq(1))
.fetchOne(user.name);
谢谢@Lukas eder。但我仍然怀疑,当数据库中没有匹配的记录时,作为查询执行结果的JOOQ记录为什么不为null。文档中提到,
fetchOne()。即使数据库中有与给定条件匹配的记录,结果记录对象也包含选定字段的空值,这些字段在将该记录映射到相应的值对象时会引发NPE。有人面临类似的问题吗?@NageswaraRaOMaridu:如果真的没有记录,那就不太可能了。你确定吗?是的,卢卡斯·埃德。我正面临着那个奇怪的问题issue@NageswaraRaOMaridu:好的,我可以请你在报告一个问题吗?如有可能,请附上MCVE。这可能取决于一些不容易重现的边缘情况:为什么要指定RecordMapperProvider
?private final RecordMapperProvider RecordMapperProvider=new DefaultRecordMapperProvider()代码>提供默认记录映射器提供程序是一个问题。如果我们没有指定任何,那么配置将采用默认的记录映射器提供程序。我希望在最近发布的RecordMapper中,DefaultConfiguration
类中发生了一些改变,它破坏了我的代码。对不起,我不确定我是否遵守了。你能说得具体点吗?您的示例中是否存在特定的bug?如果是,请您在此处报告: