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 到您的原始类型。