首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用Mapstruct和MyBatis映射嵌套列表对象

用Mapstruct和MyBatis映射嵌套列表对象
EN

Stack Overflow用户
提问于 2018-10-11 20:52:40
回答 1查看 2.4K关注 0票数 0

我不知道如何将嵌套的结果集映射到域实体中。

下面是我想要做的事情的一个简单的想法:

2表

代码语言:javascript
代码运行次数:0
运行
复制
------------
BOOKS
------------
STUDENT_ID
BOOK_NAME
DUE_DATE

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

DomainEntity (它包含嵌套列表)

LoanEntity.java

代码语言:javascript
代码运行次数:0
运行
复制
String studentId;
String studentName;
List<Book> books;

Book.java

代码语言:javascript
代码运行次数:0
运行
复制
String studentId;
String bookName;
Date dueDate;

PersistenceEntity

Loans.java

代码语言:javascript
代码运行次数:0
运行
复制
String studentId;
String studentName;
String bookName;
Date dueDate;

Dao.xml (不确定如何映射它,尝试使用)

代码语言:javascript
代码运行次数:0
运行
复制
<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"/>

...

注意,此查询将复制找到的图书#的记录。

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
@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“吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-13 11:43:34

books是复数的。所以有一个Collection。MapStruct不能在嵌套映射中执行诸如开箱即用(通常包含一个.)之类的操作。在这种情况下,原因很简单。您尝试将列表中的某些内容映射到单个对象bookName。MapStruct应该如何知道它应该选择列表中的哪个对象?您希望它生成哪些代码?

因此,要解决这个问题:您可以让MapStruct完成大部分工作(我认为您拥有比studentIdstudentName更多的属性。然后,您可以编写一个额外的手写方法,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
@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);

也就是说:假设你需要第一个结果。

但是,也许还有更好的解决方案用于与DB的集成。请查看MapStruct回购上的示例。JPA上的JPA使用上下文与DB交互。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52768764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档