java - 选择中的空值在 Records.mapping() 中产生 NullPointerException
问题描述
我的查询的 select 子句中需要一些空值:
dsl
.select(
DSL.inline(null, SQLDataType.BIGINT),
DSL.inline(null, SQLDataType.VARCHAR),
DSL.inline(null, SQLDataType.VARCHAR),
DSL.inline(null, SQLDataType.INTEGER),
CATEGORY.ABBREVIATION,
DSL.inline(null, SQLDataType.VARCHAR),
multiset(
select(
EVENT.ABBREVIATION,
EVENT.NAME,
EVENT.GENDER,
EVENT.EVENT_TYPE,
CATEGORY_EVENT.POSITION
)
.from(EVENT)
.join(CATEGORY_EVENT).on(CATEGORY_EVENT.EVENT_ID.eq(EVENT.ID))
.where(CATEGORY_EVENT.CATEGORY_ID.eq(CATEGORY.ID))
.orderBy(CATEGORY_EVENT.POSITION)
).convertFrom(r -> r.map(mapping(NumbersAndSheetsAthlete.Event::new)))
)
.from(CATEGORY)
.where(CATEGORY.ID.eq(categoryId))
.fetchOne(mapping(NumbersAndSheetsAthlete::new));
但这会NullPointerException
在Records.mapping
方法中产生一个:
java.lang.NullPointerException: null
at org.jooq.Records.lambda$mapping$16(Records.java:636) ~[jooq-3.15.0.jar:na]
at org.jooq.impl.ResultQueryTrait.fetchOne(ResultQueryTrait.java:512) ~[jooq-3.15.0.jar:na]
at ch.jtaf.service.NumberAndSheetsService.createDummyAthlete(NumberAndSheetsService.java:77) ~[classes/:na]
如何将空值与 一起使用Records.mapping
?
解决方案
您的NumberAndSheetsService
类可能使用原始类型,并且您不能映射null
到原始类型int
。
这里的混淆可能是使用 jOOQ 的反射映射,jOOQ 将null
值转换为原始类型的默认值(例如0
),由于它不遵循“快速失败”策略而被批评了几次:https ://github.com /jOOQ/jOOQ/issues/3377
在这种情况下,不涉及反射映射,只是您的构造函数引用,jOOQ 并没有真正意识到,因此它无法为您映射null
到您的原始类型。
推荐阅读
- shell - 将文件读入字符串时,read 或 cat 更有效吗?
- hive - 根据 Presto/Hive 中的列值聚合列
- javascript - Prestashop - 未捕获的 ReferenceError:未定义 displayFlags
- javascript - js中的document.querySelector null
- javascript - 使用文件系统包读取文件
- arrays - 将嵌套散列变成单个散列
- reactjs - react-redux 不产生输出值
- tensorflow - Tensorflow ValueError:没有要保存的变量(但有很多)
- java - LOAD DATA LOCAL INFILE 导入错误
- php - 本地 Xampp 服务器不区分不同用户的 php 会话