关于SpringDataJPA和MapStruct的使用

发布于 2022-09-12 13:09:54 字数 2119 浏览 12 评论 0

我使用SpringDataJpa进行多表关联,其中几个实体类的对应情况如下:

User:
public class User extends BaseEntity  {
 private String username;
 private String password;
 @ManyToOne ( cascade = CascadeType.ALL, fetch = FetchType.LAZY )
 @JoinColumn ( name = "dept_id" )
 private Department depts;
 @ManyToOne ( cascade = CascadeType.ALL, fetch = FetchType.LAZY )
 @JoinColumn ( name = "role_id" )
 private Role role;
}
Role :
public class Role extends BaseEntity {
 private String role;
 private String roleName;
 @OneToMany (mappedBy = "roles",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
 private Set<User> users;
 @ManyToMany (mappedBy = "roles",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
 @JoinTable(name = "t_role_route",joinColumns=@JoinColumn(name="role_id",referencedColumnName = "id"),inverseJoinColumns = @JoinColumn(name = "route_id"))
 @JsonIgnore
 private Set<Route> routes;
 @ManyToOne ( cascade = CascadeType.ALL, fetch = FetchType.LAZY )
 @JoinColumn ( name = "dept_id" )
 private Department depts;
}
Route:
public class Route extends BaseEntity {
 private String route;
 private String routeName;
 @ManyToMany(mappedBy = "routes")
 private Set<Role> roles;
}
Department:
public class Department extends BaseEntity {
 private String deptName;
 private String dept;
 @OneToMany (mappedBy = "depts",cascade= CascadeType.ALL,fetch= FetchType.LAZY)
 private Set<User> users;
 @OneToMany (mappedBy = "depts",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
 private Set<Role> roles;
}

现在我在登录后想返回这么一个对象:
UserVo:

private String username;
private String password;
private List<String> routes;
private List<String> routeNames;
private String deptName;
private String dept;
private Collection<? extends GrantedAuthority> authorities;

其中routesrouteNames是role中routes的属性,deptNamedept是user中dept的属性,现在我想在用户登陆的时候根据username 从数据库查询到user以及关联的信息,并且使用mapStruct进行转换成userVO,请问这个该怎么转化呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱人如己 2022-09-19 13:09:54

最近项目上使用了MapStruct,开始感觉一般,使用久了有点舒服了,感觉掌握了不少,跑来Segmentfault上挑战一下,哈哈哈,就搜到这个问题,有点挖坟的亚子

直接上结果,大概应该这么写吧

    @Mapping(source = "role.routes", target = "routes")
    @Mapping(source = "role.routes", target = "routeNames", qualifiedByName = "routeSetToRouteNames")
    @Mapping(source = "depts.dept", target = "dept")
    @Mapping(source = "depts.deptName", target = "deptName")
    UserVo userToUserVo(User user);

    default List<String> routeSetToRouteList(Set<Route> routes) {
        return routes.stream().map(Route::getRoute).collect(Collectors.toList());
    }

    @Named(value = "routeSetToRouteNames")
    default List<String> routeSetToRouteNames(Set<Route> routes) {
        return routes.stream().map(Route::getRouteName).collect(Collectors.toList());
    }

当然最后一个字段authorities题主没有提怎么赋值,我也就没看了

这其中有个小难点,就是Set<Route>routesSet<Route>routeNames,不加@Named限定,会报错

Ambiguous mapping methods found for mapping property xxx

因为他们的入参和出参类型是一样,所以MapStruct会判断不出该选哪个映射方法,因此需要用@Named做一个方法的名称限定,简单理解为取个名字,然后在特定的@Mapping选择限定的映射方法,参见官方文档其中Example 49Example 50
image.png

大概是这样吧~仅供参考...当然可能参考都用不上,都这么久了,要不然题主自己写出来了,要不然直接手动映射,放弃MapStruct了...只当给以后来搜类似问题的人一点小小的参考叭!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文