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

时间:2019-04-30 11:32:13

标签: postgresql spring-boot 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);
}

}

1 个答案:

答案 0 :(得分:1)

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

  

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

是的,这是预期的。当您调用into(String.class)时,这将尝试找到最合适的String构造函数并使用string参数进行调用,在这种情况下,您实际上是在调用new String(null),这是不可能的

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

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