首页 > 解决方案 > 选择中的空值在 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));

但这会NullPointerExceptionRecords.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

标签: javajooq

解决方案


您的NumberAndSheetsService类可能使用原始类型,并且您不能映射null到原始类型int

这里的混淆可能是使用 jOOQ 的反射映射,jOOQ 将null值转换为原始类型的默认值(例如0),由于它不遵循“快速失败”策略而被批评了几次:https ://github.com /jOOQ/jOOQ/issues/3377

在这种情况下,不涉及反射映射,只是您的构造函数引用,jOOQ 并没有真正意识到,因此它无法为您映射null到您的原始类型。


推荐阅读