使用 Mapstruct 作为 JOOQ 的 RecordMapper

Use Mapstruct as RecordMapper for JOOQ

我想实现自己的 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 我的语言 table,因此无法施放 recordLanguageRecord。知道我需要更改什么吗?

使用 RecordImpl 时有趣的是,如果我做这样的事情

record.get(LANGUAGE.LANGUAGE_TAG);

它已经得到了错误的信息(它正在得到 LANGUAGE.NAMESPACE_ID)。所以这样获取然后映射到POJO也是错误的。

(根据这个问题 创建了这个问题)

目前不支持映射源和目标的泛型: https://github.com/mapstruct/mapstruct/issues/583

示例解决方法:

https://github.com/mapstruct/mapstruct/issues/631

定义映射器时需要使用具体的类。

问题是此处描述的问题的结果:

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

问题: 如果 JOOQ 生成 POJOs/Records/etc。基于具有特定顺序的 table 属性的数据库,但是在 JOOQ 已经生成 POJOs/Records/etc 之后属性的顺序发生了变化。 SELECT * 可能不会将字段映射到 POJO

中的正确属性

例如POJO Language 具有属性 countrylanguage 并且突然 Language 包含 Lanugage.getLanguage()country 的 table 值和table lanugageLanguage.getCountry() 中的值。

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