我想实现我自己的RecordMapper
并使用Mapstruct将记录映射到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()
);
}
}
问题是,作为记录
我实际上并没有得到LanguageRecord
,而是我的语言表中的RecordImpl
,因此无法将记录
转换为LanguageRecord
。知道我需要改变什么吗?
使用RecordImpl时有趣的是,如果我这样做
record.get(LANGUAGE.LANGUAGE_TAG);
它已经得到了错误的信息(它得到了语言。NAMESPACE_ID)。因此,当像这样得到它,然后将它映射到POJO时,它也是错误的。
(基于JOOQ中的该问题POJO映射创建了该问题,与参数顺序无关)
这个问题是这里描述的问题的结果:JOOQ中的POJO映射与参数顺序无关
但事实证明,这个问题甚至不需要任何类型的映射器就可以解决。
问题:如果JOOQ生成pojo/Records/etc。基于一个数据库,该数据库以一定顺序具有表的属性,但属性的顺序在JOOQ已经生成pojo/Records/etc之后发生变化。选择*可能不会将字段映射到POJO中的正确属性
例如,POJOLanguage
具有属性Country
和Language
,突然Language
包含Lanugage.getLanguage()
中Country
的表值和Language.getCountry()
中lanugage
的表值。
这个问题可以通过在SELECT语句中指定顺序(无论数据库字段的实际顺序是什么)来解决,例如SELECT language,country。
目前不支持用于映射源和目标的泛型:https://github.com/mapstruct/mapstruct/issues/583
示例wrokaround:
https://github.com/mapstruct/mapstruct/issues/631
定义映射器时需要使用具体类。
我有两个表,asdf和qwer,两个表都有一个名为“id”的主键。当我连接这两个表时,结果将有两个名为id的列,而JOOQ无法将记录正确映射到pojo。 现在,每个Asdf实例都与元组中对应的Qwer实例具有相同的id。 有没有聪明的别名技巧可以解决这个问题,或者我在JOOQ文档中遗漏了什么,或者这是JOOQ中的一个bug?
我不熟悉Mapstruct,在特定用例中遇到问题 因此,如果我的来源属性hotmail.com我的目标属性应该收到“个人”,如果我的来源facebook.com我的目标应该收到“公司”。 我想用表达法,但没法绕过它。我该怎么做?
是否可能在MapStruct中使用不同的映射器?我有这个映射器 是否可以将此实现更改为MapStruct?
我对这些技术是新的,所以提前道歉。 我在我的应用程序中使用了springboot、Spring JPA、hibernate和mapstruct。
按照第二个链接中包含的示例,我已经测试了: 但我没有实现使用。
我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好