当前位置: 首页 > 知识库问答 >
问题:

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

傅啸
2023-03-14

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

以下是我想做的事情的大概想法:

2张桌子

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

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

域实体(包含嵌套列表)

LoanEntity.java

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

Book.java

String studentId;
String bookName;
Date dueDate;

持久实体

Loans.java

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

Dao.xml(不知道如何映射它,尝试使用一个)

<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个答案

阎麒
2023-03-14

书籍是复数。因此有一个<code>集合</code>。MapStruct无法执行<code>书籍之类的操作。bookname是嵌套映射中的开箱即用(这些映射通常包含一个)。在这种情况下,原因很简单。您尝试将列表中的某个对象映射到单个对象bookName。MapStruct应该如何知道它应该选择列表中的哪个对象?您希望它生成哪些代码

所以,为了解决这个问题:你可以让MapStruct完成大部分工作(我想你比studentIdstudentName有更多的属性。然后,您可以编写其他手写方法,如下所示:

@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 repo上的示例。JPA上的一个使用上下文与数据库交互。

 类似资料:
  • 我如何在下面的场景中使用Mapstruct进行bean映射。 现在我想把sourceId映射到targetId,courseName映射到subjectName,studentName映射到memberName(list到list)。

  • 我创建映射如下所示。如何将平面dto对象属性(街道、城市等)映射到域对象中的嵌套地址。当我试着去做的时候,我发现了一个错误: [错误]诊断:返回类型中的属性“Address.PostalCode”未知。@Mapping(来源=“City”,目标=“Address.City”), 还有类...

  • 我正在尝试映射我的遗留API对象(我无法更改它),该对象具有嵌套的原始类型属性。列表的元素与DTO列表的元素不兼容,应显式映射为嵌套。不幸的是,MapStruct似乎认为原始与所有类型化列表兼容,并忽略了我试图指定的任何映射,而生成的代码不能正常工作,随后在序列化程序的某个地方产生错误。 我的API对象具有嵌套的原始类型列表: 我的DTO对象具有DTO值类型元素的泛型类型列表: ...但MapSt

  • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->

  • 假设我有这些实体: null

  • 有人能帮忙填写上面的评论部分吗?或者是否有其他选项来映射这些对象? 编辑:我尝试了下面的解决方案,但是接口实现类本身发生了变化。