如何使用 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声明此查询返回的所有字段,然后使用@Resultmany属性链接另一个子查询。 通过 XML,在您的“ResultMap”XML 标记中使用 &lt;Collection&gt; 标记。

【讨论】:

以上是关于如何使用 MyBatis Mapper 在 POJO 中获取 List<String>?的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis的原理分析1(@Mapper是如何生效的)

02.MyBatis在DAO层开发使用的Mapper动态代理方式

mybatis plus自定义的mapper如何动态切换数据源

一个mybatis的mapper.xml文件,如何被其他的mapper.xml引用?

MyBatis 中 Mapper 接口的使用原理

如何在mybatis的mapper接口中为更新查询编写foreach循环