【发布时间】:2020-07-18 07:47:49
【问题描述】:
我想实现我自己的RecordMapper 并使用 Mapstruct 将 Record 映射到 POJO。我不太明白如何做到这一点。我关注了这部分文档:https://www.jooq.org/doc/3.13/manual/sql-execution/fetching/pojos-with-recordmapper-provider/
我的映射器如下所示:
public class LanguageMapper<R extends Record, E> implements RecordMapper<R, Language> {
@Override
public Language map(R record) {
LanguageRecord languageRecord = (LanguageRecord) record;
// this is just an example, in the future this is the kind of mapping that would be performed automatically via mapstruct
return new Language(
languageRecord.getId(),
languageRecord.getNamespaceId(),
languageRecord.getLanguage(),
languageRecord.getCountryCode(),
languageRecord.getLanguageTag()
);
}
}
问题在于,作为record,我实际上并没有得到LanguageRecord,而是我的语言表的RecordImpl,因此无法将record 转换为LanguageRecord。知道我需要改变什么吗?
使用RecordImpl 时有趣的是,如果我做这样的事情
record.get(LANGUAGE.LANGUAGE_TAG);
它已经获得了错误的信息(它正在获得 LANGUAGE.NAMESPACE_ID)。因此,当这样获取它然后将其映射到 POJO 时,它也是错误的。
(根据这个问题POJO Mapping in JOOQ regardless of parameter order创建了这个问题)
【问题讨论】:
-
1) 我不确定 MapStruct 与您的问题有何关联。 2) 你已经回答了你不能投的部分。
RecordMapperProvider是所有RecordMapper实例的通用全局 提供程序,而不仅仅是您对单个查询执行感兴趣的实例。到目前为止,您在问题中提出的事实无法回答您获得错误数据的原因。我可以推荐阅读本指南:stackoverflow.com/help/minimal-reproducible-example。到目前为止,很难看到您正在尝试做什么以及您的问题到底是什么失败了 -
抱歉 Lukas,我进行了一些挖掘,结果发现我遇到的问题只是由于执行带有星号的选择而不是指定单个字段而引起的。一旦我指定了字段,POJO 映射就可以正常工作。我的问题现在解决了。
-
使用显式星号将按照它们在 SQL 表中定义的顺序生成列。如果生成的代码与 SQL 表不同步,则生成的顺序可能不正确,因此 jOOQ 会期望不同的顺序...
标签: java database mapping record jooq