Используйте Mapstruct в качестве RecordMapper для JOOQ - PullRequest
3 голосов
/ 06 апреля 2020

Я хотел бы реализовать свой собственный 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()
    );
  }
}

Проблема в том, что как record я на самом деле не получает LanguageRecord, а RecordImpl моей языковой таблицы и поэтому не может привести record к LanguageRecord. Любая идея, что мне нужно изменить?

Что интересно при использовании RecordImpl, если я сделаю что-то вроде этого

record.get(LANGUAGE.LANGUAGE_TAG);

Он уже получит неверную информацию (он получает LANGUAGE.NAMESPACE_ID). Таким образом, при получении этого и последующем сопоставлении его с POJO это также будет неправильно.

(Создан этот вопрос на основе этого вопроса Отображение POJO в JOOQ независимо от порядка параметров )

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Вопрос был результатом проблемы, описанной здесь: Отображение POJO в JOOQ независимо от порядка параметров

Но оказывается, что проблема может быть решена даже без необходимости какого-либо mapper.

Проблема: Если JOOQ генерирует POJOs / Records / et c. основанный на базе данных, которая имеет атрибуты таблицы в определенном порядке, но порядок атрибутов изменяется после того, как JOOQ уже сгенерировал POJOs / Records / et c. возможно, что SELECT * не сопоставит поля с правильными атрибутами в POJO

Например, POJO Language имеет атрибуты country и language, и внезапно Language содержит табличное значение country в Lanugage.getLanguage() и табличное значение lanugage в Language.getCountry().

Эту проблему можно решить, указав порядок (независимо от фактического порядка полей базы данных) в SELECT -общение, как SELECT language, country.

0 голосов
/ 06 апреля 2020

На данный момент нет поддержки Generics для отображения источника и цели: https://github.com/mapstruct/mapstruct/issues/583

Пример wrokaround:

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

При определении картографа вам необходимо использовать конкретные классы.

...