我有几个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);
}
}
答案 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);