select 中的空值在 Records.mapping() 中产生 NullPointerException
Null value in select produces NullPointerException in Records.mapping()
我在查询的 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));
但这会在 Records.mapping
方法中产生一个 NullPointerException
:
java.lang.NullPointerException: null
at org.jooq.Records.lambda$mapping(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
class 可能使用原始类型,您无法将 null
映射到原始类型 int
。
这里的混淆可能是jOOQ的反射映射,jOOQ将null
值转换为原始类型的默认值(例如0
),这被批评了几次,因为它没有遵循“快速失败”策略:https://github.com/jOOQ/jOOQ/issues/3377
在这种情况下,不涉及反射映射,只是您的构造函数引用,jOOQ 并没有真正意识到这一点,因此它无法为您映射 null
到您的原始类型。
我在查询的 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));
但这会在 Records.mapping
方法中产生一个 NullPointerException
:
java.lang.NullPointerException: null
at org.jooq.Records.lambda$mapping(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
class 可能使用原始类型,您无法将 null
映射到原始类型 int
。
这里的混淆可能是jOOQ的反射映射,jOOQ将null
值转换为原始类型的默认值(例如0
),这被批评了几次,因为它没有遵循“快速失败”策略:https://github.com/jOOQ/jOOQ/issues/3377
在这种情况下,不涉及反射映射,只是您的构造函数引用,jOOQ 并没有真正意识到这一点,因此它无法为您映射 null
到您的原始类型。