Отображение объекта вложенного списка с помощью Mapstruct и MyBatis - PullRequest
0 голосов
/ 11 октября 2018

Я не уверен, как отобразить вложенный набор результатов в сущность домена.

Ниже приведено краткое представление о том, что я пытаюсь сделать:

2 таблицы

------------
BOOKS
------------
STUDENT_ID
BOOK_NAME
DUE_DATE

------------
STUDENTS
------------
STUDENT_ID
STUDENT_NAME

DomainEntity (содержит вложенный список)

LoanEntity.java

String studentId;
String studentName;
List<Book> books;

Book.java

String studentId;
String bookName;
Date dueDate;

PersistenceEntity

Loans.java

String studentId;
String studentName;
String bookName;
Date dueDate;

Dao.xml (Не уверен, как сопоставить его, пробовал использовать one )

<resultMap id="loanMap" type="com.persistence.entity.Loans">
    <id property="studentId" column="studentId"/>
    <result property="studentName" column="studentName"/>
    <result property="bookName" column="bookName"/>
    <result property="dueDate" column="dueDate"/>

...

Обратите внимание, что этот запрос будет дублировать запись для количества найденных книг.

SELECT
    s.STUDENT_ID, s.STUDENT_NAME, b.BOOK_NAME, b.DUE_DATE
FROM STUDENTS s
LEFT JOIN
    BOOKS b ON s.STUDENT_ID=b.STUDENT_ID

LoanMapper.java

@Mappings({
    @Mapping(source="studentId", target="studentId"),
    @Mapping(source="studentName", target="studentName"),
    @Mapping(source="bookName", target="books.bookName"),
    @Mapping(source="dueDate", target="books.dueDate")
})
LoanEntity persistenceToDomainEntity(Loans loans);

List<LoanEntity> persistenceToDomainEntity(List<Loans> loans);

Ниже приводится ошибка, которую я получаю:

ошибка: неизвестное свойство "books.bookName" в типе результата com.loan.domain.model.Loan.Вы имели в виду books.empty?ошибка: неизвестное свойство "books.dueDate" в типе результата com.loan.domain.model.Loan.Вы имели в виду "books.empty"?

1 Ответ

0 голосов
/ 13 октября 2018

books - множественное число.Так что есть Collection.MapStruct не может делать такие вещи, как books.bookname из коробки во вложенных отображениях (обычно они содержат .).Причина в этом случае проста.Вы пытаетесь сопоставить что-либо, находящееся в списке, с единственным объектом bookName.Как MapStruct должен знать, какой объект в списке он должен выбрать?Какой код вы ожидаете, что он сгенерирует?

Итак, чтобы решить это: вы можете позволить MapStruct выполнять большую часть работы (я полагаю, у вас загружено больше свойств, чем studentId и studentName ..Затем вы можете написать дополнительный рукописный метод, подобный следующему:

@AfterMapping
default void persistenceToDomainEntity(Loans loans, @MappingTarget LoanEntity loanEntity) {
   loanEntity.setBookName( loans.getBooks().get(0).getBookName() ); //?
   loanEntity.setDueDate( loans.getBooks().get(0).getDueDate() ); //?
}

@Mappings({
    @Mapping(source="studentId", target="studentId"),
    @Mapping(source="studentName", target="studentName"),
    @Mapping(source="bookName", ignore = true),
    @Mapping(source="dueDate", ignore = true)
})
LoanEntity persistenceToDomainEntity(Loans loans);

То есть: при условии, что вам нужен первый результат.

Но, возможно, есть и более эффективные решения для интеграции с БД.примеры в MapStruct репо . В JPA используется контекст для взаимодействия с БД.

...