首页 > 解决方案 > 将jooq记录映射到对象时出现空指针异常

问题描述

我有几个 JOOQ 存储库,它们从 Postgres DB 获取数据并将数据作为值对象提供。我使用的是 JOOQ 3.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);
}

}

标签: postgresqlspring-bootjooq

解决方案


通常,您可以使用fetchOneInto(String.class),它可以在找不到记录时阻止 NPE。

但根据我的观察,这不是抛出异常,而是返回一个记录对象,其字段为(user.name),值为“null”。这是预期的吗?

是的,这是意料之中的。当您调用 时into(String.class),这将尝试找到最合适的String构造函数并使用字符串参数调用它,在这种情况下,您实际上是在调用new String(null),这是不可能的。

不过,您不必依赖这种行为。只需致电:

return jooq.build()
        .select(user.name)
        .where(user.id.eq(1))
        .fetchOne(user.name);

推荐阅读