You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JOOQ自定义类型转换时未调用DTO的setter方法问题

JOOQ映射DTO时枚举字段setter未触发问题

我使用JOOQ将SELECT查询结果映射至自定义DTO类,DTO中的ProfileType枚举字段对应数据库的Integer类型列,已配置自定义数据类型转换器。转换器的from方法能正常触发,但映射过程中DTO的profileType字段setter从未被调用,导致该字段值为null。

查询代码

public TestSuiteDto findByAuditTestSuiteId(Integer auditTestSuiteId) {

    TestSuiteJTable ts = TestSuiteJTable.TEST_SUITE;
    AuditTestSuiteJTable ats = AuditTestSuiteJTable.AUDIT_TEST_SUITE;

    List<TestSuiteDto> result = dsl.select(
                    ts.ID,
                    ts.DESCRIPTION,
                    ts.PROFILE_TYPE_ID,
                    ts.CREATED,
                    ts.ACTIVE,
                    ts.DEPRECATION,
                    ts.FEEDBACK_QUESTIONNAIRE_ID)
                .from(ts
                    .join(ats).on(ts.ID.eq(ats.TEST_SUITE_ID)))
                .where(ats.ID.eq(auditTestSuiteId))
                .fetchInto(TestSuiteDto.class);
    
    //do some stuff before returning

    return result.get(0); 
}

DTO类定义

@Data
public class TestSuiteDto {

    private Integer id;
    private String description;
    private ProfileType profileType;
    private LocalDateTime created;
    private boolean active;
    private LocalDateTime deprecation;
    private Integer feedbackQuestionnaireId;
}

自定义转换器代码

@Slf4j
public class ProfileTypeConverter implements Converter<Integer, ProfileType> {

    @Override
    public ProfileType from(Integer databaseObject) {
        log.info("ProfileTypeConverter.from {} -> {}", databaseObject, ProfileType.getFromId(databaseObject));
        return ProfileType.getFromId(databaseObject);
    }

    @Override
    public Integer to(ProfileType userObject) {
        log.info("ProfileTypeConverter.to");
        return userObject.getId();
    }

    @Override
    public Class<Integer> fromType() {
        log.info("ProfileTypeConverter.fromType");
        return Integer.class;
    }

    @Override
    public Class<ProfileType> toType() {
        log.info("ProfileTypeConverter.toType");
        return ProfileType.class;
    }
}

pom.xml配置

forcedType配置

<forcedType>
   <includeExpression>${jdbc.database}.TEST_SUITE.PROFILE_TYPE_ID</includeExpression>
   <userType>mypackage.type.ProfileType</userType>
   <converter>mypackage.converter.ProfileTypeConverter</converter>
</forcedType>

字段映射配置

<field>
    <expression>${jdbc.database}.TEST_SUITE.PROFILE_TYPE_ID</expression>
    <fieldIdentifier>
        <expression>PROFILE_TYPE_ID</expression>
    </fieldIdentifier>
    <fieldMember>
        <expression>profileType</expression>
    </fieldMember>
    <fieldGetter>
        <expression>getProfileType</expression>
    </fieldGetter>
    <fieldSetter>
        <expression>setProfileType</expression>
    </fieldSetter>
</field>

环境信息

  • JOOQ版本:3.14.16
  • Java版本:8

内容的提问来源于stack exchange,提问作者Konstantinos Raptis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:05:22