关于SpringDataJPA和MapStruct的使用
我使用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;
其中routes
和routeNames
是role中routes的属性,deptName
和dept
是user中dept的属性,现在我想在用户登陆的时候根据username 从数据库查询到user以及关联的信息,并且使用mapStruct进行转换成userVO,请问这个该怎么转化呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
最近项目上使用了
MapStruct
,开始感觉一般,使用久了有点舒服了,感觉掌握了不少,跑来Segmentfault上挑战一下,哈哈哈,就搜到这个问题,有点挖坟的亚子直接上结果,大概应该这么写吧
当然最后一个字段
authorities
题主没有提怎么赋值,我也就没看了这其中有个小难点,就是
Set<Route>
转routes
和Set<Route>
转routeNames
,不加@Named
限定,会报错因为他们的入参和出参类型是一样,所以
MapStruct
会判断不出该选哪个映射方法,因此需要用@Named
做一个方法的名称限定,简单理解为取个名字,然后在特定的@Mapping
选择限定的映射方法,参见官方文档其中Example 49和Example 50大概是这样吧~仅供参考...当然可能参考都用不上,都这么久了,要不然题主自己写出来了,要不然直接手动映射,放弃
MapStruct
了...只当给以后来搜类似问题的人一点小小的参考叭!