Postgresql 将jooq记录映射到对象时获取空指针异常

Postgresql 将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

我有两个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(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?如果是,请您在此处报告: