当前位置: 首页 > 知识库问答 >
问题:

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

毛景曜
2023-03-14

我有几个JOOQ存储库,它们从Postgres数据库获取数据,并将数据作为值对象提供。我使用JOOQ 3.10.7和一切工作正常。我已经将我的Spring启动版本从2.0.3升级到2.1.4,这将JOOQ版本升级到3.11.10。在映射Jooq记录时,我开始获取NullPointerExcema。

    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()。进入(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个答案

索梓
2023-03-14

一般来说,您可以使用fetchOneInto(String.class),这可以在找不到记录时防止NPE。

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

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

不过,你不必依赖这种行为。只要打电话:

return jooq.build()
        .select(user.name)
        .where(user.id.eq(1))
        .fetchOne(user.name);
 类似资料:
  • 我正在尝试使用Jackson将JSON映射到POJO。但是,由于此JSON包含对象的嵌套映射,当我将其反序列化到POJO时,timeseries信息不会转换为POJO。我只能在timeseries块中获取元数据部分和日期部分。timeseries块中的其他字段(如open、high和low)始终为空。 Jackson似乎无法将TimeSeries类中的字段与匹配。有人能告诉我该怎么做,或者给我指出

  • 我使用的是MySQL 5.7,我想将具有一对多关系的查询映射到其代表性记录的列表。 MySQL不支持多集,JSON仿真也不起作用,因为它无法在两个层次上引用别名。 我想知道是否有另一种方法可以让我尝试在一个查询中映射多个关系。

  • 我是struts2框架的新手,当我点击submit按钮时,我得到了空指针预期值,注册表表单值没有传递给Bean类,我在Bean类中打印表单值,它打印了空值,我找不到我的错误,请帮助我。。 指数jsp Struts.xml 动作课 例外

  • 我现在使用的是Itext PDFSmartCopy。我正在使用XMLWorker向document对象添加一些业务内容。然后我声明了一个阅读器(用于连接到此文档对象的pdf文件)。然后我用相同的文档对象和输出文件流作为参数调用PdfSmartCopy。然后使用常规步骤将页面复制到文档中, 但如果我使用一个新的文档对象ie而不添加业务内容,则这一块工作得很好。

  • 当我调用模型映射器实体到DTO转换器方法时,我总是得到空指针异常。 这是将dto转换为实体的转换器服务,反之亦然 我以前没有处理过DTO,这是我第一次使用DTO,我还需要知道这是我实现DTO转换器服务的最佳方式吗,或者是否有任何建议。 当我在测试调用中调用该方法时,我得到空值 通知实体 通知DTO