SpringBoot如何以List形式返回所有管理员用户列表
实现方案
基于你现有项目的实体配置,提供两种可直接复用的实现方式,执行效果和你写的原生SQL完全一致:
方式1:JPQL查询(JPA原生规范,不需要写数据库相关原生语句,兼容性更好)
直接在UserRepository接口中新增方法即可:
// 固定查询角色ID为2的管理员用户名列表 @Query("SELECT u.username FROM User u JOIN u.roles r WHERE r.id = 2") List<String> findAllAdminUsernames();
如果后续角色ID可能调整,也可以改成参数化形式,适配不同角色的查询需求:
@Query("SELECT u.username FROM User u JOIN u.roles r WHERE r.id = :roleId") List<String> findAllUsernamesByRoleId(Integer roleId);
调用时传入2即可拿到管理员用户名列表。
方式2:原生SQL查询(直接复用你已验证的SQL逻辑)
如果你更倾向用原生SQL,只需在@Query注解中开启nativeQuery属性即可,注意不需要写USE request_manager,项目数据源配置已经默认指定了操作的数据库:
@Query(value = "SELECT u.username FROM users u JOIN users_roles ur ON u.id = ur.user_id WHERE ur.role_id = 2", nativeQuery = true) List<String> findAllAdminUsernamesByNative();
调用方法
在业务层直接注入UserRepository调用对应方法即可:
@Service public class UserService { @Autowired private UserRepository userRepository; public List<String> getAdminUsernameList() { // 调用JPQL方法 return userRepository.findAllAdminUsernames(); // 调用参数化方法的写法:return userRepository.findAllUsernamesByRoleId(2); // 调用原生SQL方法的写法:return userRepository.findAllAdminUsernamesByNative(); } }
性能优化提示
不建议先查询全量用户再在内存中过滤角色的实现方式,这种方式在用户量较大时会产生不必要的性能开销,上述两种直接在数据库层面过滤的方案性能更优。
内容的提问来源于stack exchange,提问作者john555
相关产品推荐
相关产品推荐

