Получить пустой список для роли администратора - PullRequest
0 голосов
/ 25 января 2020

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 = []

Почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...