#spring #spring-data
#весна #spring-данные #spring
Вопрос:
В настоящее время я пытаюсь использовать @Query с выражением spring security, чтобы сопоставить любого пользователя, который принадлежит к тому же региону / местоположению, что и вошедший в систему пользователь.
Я использую следующий код для достижения этой цели
@Override
@Query(value = "select u from User u where u.region in :#{principal.region}")
Page<User> findAll(Pageable var1);
Моя пользовательская таблица имеет следующую связь с регионом
@ManyToMany( mappedBy = "users")
private List<Region> region = new ArrayList<>();
Моя таблица регионов имеет следующую связь с пользователями
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "region_users", joinColumns = @JoinColumn(name = "region_id", referencedColumnName= "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")
)
private List<User> users = new ArrayList<>();
мой пользовательский основной объект имеет следующее поле region
private List<Region> region;
public UserPrincipal(Long id, String username, String password,
Collection<? extends GrantedAuthority> authorities, Role role, List<Region> region) {
this.id = id;
this.username = username;
this.password = password;
this.authorities = authorities;
this.role = role;
this.region = region;
}
с помощью следующего метода get
public List<Region> getRegion() { return this.region; }
Когда я делаю запрос к конечной точке api, которая использует переопределенный метод find all, я получаю следующее исключение
Вызвано: java.lang.Исключение IllegalArgumentException: Значение параметра [com.example.ReportTool.model.Регион@18ab655a] не соответствует ожидаемому типу [java.util.Коллекция (n/a)]
Кто-нибудь может помочь мне с этим вопросом? также, если этот вопрос слишком расплывчатый, пожалуйста, дайте мне знать.
Комментарии:
1. Вам необходимо указать принципал в качестве параметра.
Page<User> findAll(Pageable var1, UserPrincipal principal);
2. Я должен был упомянуть, что я использую Spring data rest и переопределяю метод Find all в PagingAndSortingRepository, поэтому я не могу добавить User Principal к методу
3. Что ж, тогда вам нужно создать новый метод, такой как
@Query(value = "SELECT * FROM USERS u WHERE u.region in :#{principal.region}", countQuery = "SELECT count(*) FROM USERS WHERE u.region in :#{principal.region}", nativeQuery = true)
Страница<Пользователь> findAllByRegion(Pageable var1, пользовательский принципал);4. Возможно, я не понимаю ответа, но я не вижу, как это решило бы проблему, мне нужно использовать переопределенный метод findall для PagingAndSortingRepository, если я создам новый запрос, который не переопределяет существующий метод, тогда мне нужно будет переопределить существующий контроллер, созданный spring data rest, и создать свое собственное сопоставление для запроса get, а затем вызвать новый запрос.