Use Mapstruct as RecordMapper for JOOQ

≯℡__Kan透↙ 提交于 2020-05-29 07:36:22

问题


I would like to implement my own RecordMapper and use Mapstruct to map the Record to the POJO. I don't quite understand how to accomplish this. I followed this part of the docs: https://www.jooq.org/doc/3.13/manual/sql-execution/fetching/pojos-with-recordmapper-provider/

My mapper looks like this:

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()
    );
  }
}

The issue is that as a record I'm not actually getting a LanguageRecord but a RecordImpl of my language table and can thus not cast record to LanguageRecord. Any idea what I need to change?

What's interesting when using the RecordImpl is, if I do something like this

record.get(LANGUAGE.LANGUAGE_TAG);

It will already get the wrong information (it's getting the LANGUAGE.NAMESPACE_ID). Thus when getting it like this and then mapping it to the POJO it will be wrong as well.

(Created this question based on this question POJO Mapping in JOOQ regardless of parameter order)


回答1:


There is no support for Generics for mapping source and target as of now : https://github.com/mapstruct/mapstruct/issues/583

Example wrokaround:

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

You need to use concrete classes when defining the mapper.




回答2:


The question was a result of the problem described here: POJO Mapping in JOOQ regardless of parameter order

But it turns out that the problem can be solved without even needing any sort of mapper.

Problem: If JOOQ generates POJOs/Records/etc. based on a database which has the attributes of a table in a certain order, but the order of the attributes changes after JOOQ already generated the POJOs/Records/etc. it's possible that a SELECT * will not map the fields to the correct attributes in the POJOs

E.g. The POJO Language has the attributes country and language and suddenly Language contains the table value of country in Lanugage.getLanguage() and the table value of lanugage in Language.getCountry().

This issue can be solved by specifying an order (regardless what the actual order of the database fields are) in the SELECT-statement, like SELECT language, country.



来源:https://stackoverflow.com/questions/61057659/use-mapstruct-as-recordmapper-for-jooq

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!