当前位置: 首页 > 知识库问答 >
问题:

使用Mapstruct作为JOOQ的记录映射器

芮意
2023-03-14

我想实现我自己的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映射创建了该问题,与参数顺序无关)

共有2个答案

姚洲
2023-03-14

这个问题是这里描述的问题的结果:JOOQ中的POJO映射与参数顺序无关

但事实证明,这个问题甚至不需要任何类型的映射器就可以解决。

问题:如果JOOQ生成pojo/Records/etc。基于一个数据库,该数据库以一定顺序具有表的属性,但属性的顺序在JOOQ已经生成pojo/Records/etc之后发生变化。选择*可能不会将字段映射到POJO中的正确属性

例如,POJOLanguage具有属性CountryLanguage,突然Language包含Lanugage.getLanguage()Country的表值和Language.getCountry()lanugage的表值。

这个问题可以通过在SELECT语句中指定顺序(无论数据库字段的实际顺序是什么)来解决,例如SELECT language,country。

郭和硕
2023-03-14

目前不支持用于映射源和目标的泛型: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得到了很好