postgresql - 将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);
}
}
解决方案
通常,您可以使用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);
推荐阅读
- artifactory - Docker 层复用
- python - Boto3 未使用 DynamoDB 加密 SDK 定位凭证
- azure-active-directory - 如何使用来自不同租户的用户登录 Azure App?
- c# - 结构是否会导致内存问题
? - oracle - 如何在plSQL中将序列添加到主键
- python - python:如何将 p 值重要性添加到 barplot
- bash - Bash 版本不支持选项 local -n
- sms - Orange API 短信是否向 Etisalat 和 Vodafone 发送消息?
- python - 将一个numpy数组附加到python列表
- android - 出现错误预期 BEGIN_ARRAY 但在第 1 行第 2 列路径 $ BEGIN_OBJECT