如何使用 MyBatis Mapper 在 POJO 中获取 List<String>?
Posted
技术标签:
【中文标题】如何使用 MyBatis Mapper 在 POJO 中获取 List<String>?【英文标题】:How to get List<String> inside of a POJO with MyBatis Mapper? 【发布时间】:2021-06-09 04:14:20 【问题描述】:我的目标是使用 'UsersMapper' MyBatis Mapper 填充 UserDto
POJO。
public class UserDto
private String username;
private String password;
private List<String> authorities;
public String getUsername()
return username;
public String getPassword()
return password;
public Set<SimpleGrantedAuthority> getAuthorities()
return authorities.stream()
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toSet());
@Mapper
public interface UsersMapper
@Select("SELECT users.username, users.password, role_authorities.authority " +
"FROM users " +
"JOIN role_members ON role_members.username = users.username " +
"AND users.username=#username " +
"JOIN role_authorities ON role_authorities.role_uuid = role_members.role_uuid")
Optional<UserDto> getUsers(String username);
这就是我直接运行 SQL 语句时的样子。
我的预期结果是:MyBatis 成功填充UserDto
POJO。
我的实际结果是我遇到了异常
org.springframework.security.authentication.InternalAuthenticationServiceException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
【问题讨论】:
见FAQ entry。 【参考方案1】:此 POJO 有一个类型为 List
的字段。 @Select
还不够,你有两种方法可以解决这个问题:
-
添加
@Results
声明此查询返回的所有字段,然后使用@Result
的many
属性链接另一个子查询。
通过 XML,在您的“ResultMap”XML 标记中使用 <Collection>
标记。
【讨论】:
以上是关于如何使用 MyBatis Mapper 在 POJO 中获取 List<String>?的主要内容,如果未能解决你的问题,请参考以下文章
02.MyBatis在DAO层开发使用的Mapper动态代理方式
mybatis plus自定义的mapper如何动态切换数据源