使用 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,因此无法施放 record
到 LanguageRecord
。知道我需要更改什么吗?
使用 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
具有属性 country
和 language
并且突然 Language
包含 Lanugage.getLanguage()
中 country
的 table 值和table lanugage
在 Language.getCountry()
中的值。
这个问题可以通过在 SELECT
语句中指定一个顺序(不管数据库字段的实际顺序是什么)来解决,比如 SELECT language, country
.
我想实现自己的 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,因此无法施放 record
到 LanguageRecord
。知道我需要更改什么吗?
使用 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
具有属性 country
和 language
并且突然 Language
包含 Lanugage.getLanguage()
中 country
的 table 值和table lanugage
在 Language.getCountry()
中的值。
这个问题可以通过在 SELECT
语句中指定一个顺序(不管数据库字段的实际顺序是什么)来解决,比如 SELECT language, country
.