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
相关产品推荐
相关产品推荐

