如何使用映射器和 DTO 在 Jhipster 中获取整个实体?

Jor*_*res 3 jhipster mapstruct

我是 mapstruct 的新手,有几个问题无法找到答案。

我有一个 Entity1 (对象),它与 Entity2 具有 Many2Many 关系。在这种情况下,我的 Entity1DTO 可以使用 Set 从 Entity1 获取所有数据 (Swagger):

    private Set<Entity2DTO> appusers = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)

该 Set 包含有关所有 Entity2DTO 对象的所有信息。

然后,我有另一个与 Entity1 具有关系 (One2Many) 的 Entity3。当我想获取与Entity3(One2Many)所有相同的信息时,它只带来Entity3的ID,其余属性为空。

    private Entity3DTO entity3;
Run Code Online (Sandbox Code Playgroud)

映射器:

@Mapping(target = "entity3", source = "entity3", qualifiedByName = "id")
Entity3DTO toDto(Entity3 s);
Run Code Online (Sandbox Code Playgroud)

如果我更改映射器并不仅包括 id,还包括其他属性(它将起作用),但我想问是否有更简单或更直接的方法来更改 DTO 或映射器以将其余的数据,有吗?

而且...为什么它会在 Set 的情况下带来所有数据,而在其他情况下则不会?

MapStruct 文档不够清晰,所以如果您有 Jhipster 的任何其他示例,那就太好了。

感谢您的帮助。

use*_*296 5

我不确定我是否理解正确,但我猜你的问题是你想Entity1Mapper映射嵌套的所有属性Entity3而不仅仅是它的id.

在你的 中Entity1Mapper.java,改变这个:

@Mapping(target = "entity3", source = "entity3", qualifiedByName = "id")
Entity1DTO toDto(Entity1 s);
Run Code Online (Sandbox Code Playgroud)

进入这个:

@Mapping(target = "entity3", source = "entity3")
Entity1DTO toDto(Entity1 s);
Run Code Online (Sandbox Code Playgroud)

这样,您就可以告诉 MapStruct 使用完整的toDto(...)映射方法,而不是toDtoId(...)仅填充对象 ID。

示例项目

我生成了一个小型 JHipster 7.0.1 项目来重现并解决您的问题。

这是 JDL:

entity Entity1
entity Entity2
entity Entity3 { name String }

relationship ManyToMany { Entity1 to Entity2 }
relationship OneToMany { Entity3 to Entity1 }

dto all with mapstruct
Run Code Online (Sandbox Code Playgroud)

使用新生成的项目,您可以启动它并转到Entity1主页并编辑第一个页面以添加Entity3。如果您检查刚刚编辑的Entity1GET的详细信息页面中的调用,您将看到Entity3仅具有预期的(注意名称的含义)。IDNULL

entity Entity1
entity Entity2
entity Entity3 { name String }

relationship ManyToMany { Entity1 to Entity2 }
relationship OneToMany { Entity3 to Entity1 }

dto all with mapstruct
Run Code Online (Sandbox Code Playgroud)

然后去Entity1Mapper.java并删除, qualifiedByName = "id"的映射中的部分entity3。就像这样:

前:

{
  "id" : 1,
  "entity2s" : [ {
    "id" : 1
  } ],
  "entity3" : {
    "id" : 1,
    "name" : null
  }
}
Run Code Online (Sandbox Code Playgroud)

后:

    @Mapping(target = "entity2s", source = "entity2s", qualifiedByName = "idSet")
    @Mapping(target = "entity3", source = "entity3", qualifiedByName = "id")
    Entity1DTO toDto(Entity1 s);
Run Code Online (Sandbox Code Playgroud)

等待服务器端重新编译并重新加载页面,就可以了:

    @Mapping(target = "entity2s", source = "entity2s", qualifiedByName = "idSet")
    @Mapping(target = "entity3", source = "entity3")
    Entity1DTO toDto(Entity1 s);
Run Code Online (Sandbox Code Playgroud)