如何使用映射器和 DTO 在 Jhipster 中获取整个实体?
How to get a whole entity in Jhipster using mappers and DTOs?
我是 mapstruct 的新手,有几个问题找不到答案。
我有一个 Entity1(对象),它与 Entity2 有 Many2Many 关系。在这种情况下,我的 Entity1DTO 可以使用 Set:
从 Entity1 获取所有数据 (Swagger)
private Set<Entity2DTO> appusers = new HashSet<>();
该集合包含有关所有 Entity2DTO 对象的所有信息。
然后,我有另一个 Entity3 与 Entity1 有关系 (One2Many)。当我想获取所有与 Entity3 (One2Many) 相同的信息时,它只带来了 Entity3 的 ID,其余属性为空。
private Entity3DTO entity3;
映射器:
@Mapping(target = "entity3", source = "entity3", qualifiedByName = "id")
Entity3DTO toDto(Entity3 s);
如果我更改映射器并不仅包括 id,还包括其他属性(它会起作用),但我想问一下是否有更简单或更直接的方法将 DTO 或映射器更改为带上剩下的数据,有没有?
而且...为什么它在 Set 的情况下带来了所有数据,而在其他情况下却没有?
MapStruct documentation is 不够清楚,所以如果你有任何其他 Jhipster 的例子那就太好了。
感谢您的帮助。
我不确定我是否理解正确,但我猜你的问题是你希望 Entity1Mapper
映射嵌套 Entity3
的所有属性,而不仅仅是它的 id
.
在您的 Entity1Mapper.java
中,更改为:
@Mapping(target = "entity3", source = "entity3", qualifiedByName = "id")
Entity1DTO toDto(Entity1 s);
进入这个:
@Mapping(target = "entity3", source = "entity3")
Entity1DTO toDto(Entity1 s);
通过这种方式,您告诉 MapStruct 使用完整的 toDto(...)
映射方法,而不是仅填充对象 ID 的 toDtoId(...)
。
示例项目
我已经生成了一个小的 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
使用新生成的项目,您可以启动它并转到 Entity1 主页并编辑第一个以添加 Entity3.如果您检查刚刚编辑的 Entity1 的详细信息页面中的 GET
调用,您会看到 Entity3 只有一个 ID
(注意名称是如何 NULL
)正如预期的那样。
{
"id" : 1,
"entity2s" : [ {
"id" : 1
} ],
"entity3" : {
"id" : 1,
"name" : null
}
}
然后转到Entity1Mapper.java
并删除entity3
映射中的, qualifiedByName = "id"
部分。像这样:
之前:
@Mapping(target = "entity2s", source = "entity2s", qualifiedByName = "idSet")
@Mapping(target = "entity3", source = "entity3", qualifiedByName = "id")
Entity1DTO toDto(Entity1 s);
之后:
@Mapping(target = "entity2s", source = "entity2s", qualifiedByName = "idSet")
@Mapping(target = "entity3", source = "entity3")
Entity1DTO toDto(Entity1 s);
等待服务器端重新编译并重新加载页面,就可以了:
{
"id" : 1,
"entity2s" : [ {
"id" : 1
} ],
"entity3" : {
"id" : 1,
"name" : "Incredible Account"
}
}
我是 mapstruct 的新手,有几个问题找不到答案。
我有一个 Entity1(对象),它与 Entity2 有 Many2Many 关系。在这种情况下,我的 Entity1DTO 可以使用 Set:
从 Entity1 获取所有数据 (Swagger) private Set<Entity2DTO> appusers = new HashSet<>();
该集合包含有关所有 Entity2DTO 对象的所有信息。
然后,我有另一个 Entity3 与 Entity1 有关系 (One2Many)。当我想获取所有与 Entity3 (One2Many) 相同的信息时,它只带来了 Entity3 的 ID,其余属性为空。
private Entity3DTO entity3;
映射器:
@Mapping(target = "entity3", source = "entity3", qualifiedByName = "id")
Entity3DTO toDto(Entity3 s);
如果我更改映射器并不仅包括 id,还包括其他属性(它会起作用),但我想问一下是否有更简单或更直接的方法将 DTO 或映射器更改为带上剩下的数据,有没有?
而且...为什么它在 Set 的情况下带来了所有数据,而在其他情况下却没有?
MapStruct documentation is 不够清楚,所以如果你有任何其他 Jhipster 的例子那就太好了。
感谢您的帮助。
我不确定我是否理解正确,但我猜你的问题是你希望 Entity1Mapper
映射嵌套 Entity3
的所有属性,而不仅仅是它的 id
.
在您的 Entity1Mapper.java
中,更改为:
@Mapping(target = "entity3", source = "entity3", qualifiedByName = "id")
Entity1DTO toDto(Entity1 s);
进入这个:
@Mapping(target = "entity3", source = "entity3")
Entity1DTO toDto(Entity1 s);
通过这种方式,您告诉 MapStruct 使用完整的 toDto(...)
映射方法,而不是仅填充对象 ID 的 toDtoId(...)
。
示例项目
我已经生成了一个小的 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
使用新生成的项目,您可以启动它并转到 Entity1 主页并编辑第一个以添加 Entity3.如果您检查刚刚编辑的 Entity1 的详细信息页面中的 GET
调用,您会看到 Entity3 只有一个 ID
(注意名称是如何 NULL
)正如预期的那样。
{
"id" : 1,
"entity2s" : [ {
"id" : 1
} ],
"entity3" : {
"id" : 1,
"name" : null
}
}
然后转到Entity1Mapper.java
并删除entity3
映射中的, qualifiedByName = "id"
部分。像这样:
之前:
@Mapping(target = "entity2s", source = "entity2s", qualifiedByName = "idSet")
@Mapping(target = "entity3", source = "entity3", qualifiedByName = "id")
Entity1DTO toDto(Entity1 s);
之后:
@Mapping(target = "entity2s", source = "entity2s", qualifiedByName = "idSet")
@Mapping(target = "entity3", source = "entity3")
Entity1DTO toDto(Entity1 s);
等待服务器端重新编译并重新加载页面,就可以了:
{
"id" : 1,
"entity2s" : [ {
"id" : 1
} ],
"entity3" : {
"id" : 1,
"name" : "Incredible Account"
}
}