My pojo:
@Entity
@Table(name = "usr") // PostgreSQL not work with table "user"
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@NotNull
private String username;
@NotNull
private String password;
@NotNull
private boolean active;
@NotNull
@ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
@Column(name = "role", nullable = false)
@CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"))
@Enumerated(EnumType.STRING)
private Set<Role> roles;
my Role.class
public enum Role {
ADMIN, MODERATOR, USER;
}
Мой репозиторий:
Я хочу получать пользователей только с набором ролей (например, только Role.ADMIN):
import java.util.List;
import java.util.Set;
// Use JPQL
public interface UserRepository extends CrudRepository<User, Integer> {
User findByUsername(String username);
@Query(value = "SELECT * FROM usr INNER JOIN user_roles ur ON usr.id = ur.user_id WHERE ur.role IN :roles", nativeQuery = true)
List<User> findAllByRoles(@Param("roles") Set<Role> roleSet);
}
Здесь мой контроллер:
@Controller
public class UsersController {
@Value("${spring.application.name}")
private String appName;
@Autowired
private UserRepository userRepository;
private static Logger logger = LogManager.getLogger(UsersController.class);
// If class has only one constructore then @Autowired wiil execute automatically
public UsersController(UserRepository userRepository) {
this.userRepository = userRepository;
User user = new User();
user.setUsername("admin@admin.com");
user.setPassword("admin@admin.com");
user.setCreated(new Date());
user.setActive(true);
user.setRoles(new HashSet<>(Arrays.asList(Role.ADMIN)));
userRepository.save(user);
}
@GetMapping("/users")
public String getAllUsers(Model model) {
model.addAttribute("usersList", userRepository.findAll());
Set<Role> roleSet = new HashSet<>();
roleSet.add(Role.ADMIN);
logger.info("find_amdins, roleSet = " + roleSet);
List<User> adminsList = userRepository.findAllByRoles(roleSet);
logger.info("adminsList = " + adminsList);
model.addAttribute("adminsList", adminsList);
model.addAttribute("appName", appName);
return "users";
}
Как видите, я создал один ADMIN в конструкторе. Хорошо.
Теперь я хочу получить только АДМИН. Вот код:
Set<Role> roleSet = new HashSet<>();
roleSet.add(Role.ADMIN);
logger.info("find_amdins, roleSet = " + roleSet);
List<User> adminsList = userRepository.findAllByRoles(roleSet);
logger.info("adminsList = " + adminsList);
Но при вызове метода getAllUsers
в результате получается пустой список. В логах:
[INFO ] 2020-01-25 19:21:13.040 [http-nio-8090-exec-2] LoginController - open_login.html
[INFO ] 2020-01-25 19:21:15.804 [http-nio-8090-exec-6] UsersController - find_amdins, roleSet = [ADMIN]
[INFO ] 2020-01-25 19:21:15.854 [http-nio-8090-exec-6] UsersController - adminsList = []
Почему?