@Query не соответствует ожидаемому типу [java.util.Коллекция (n / a)]

#java #spring-boot

#java #весенняя загрузка

Вопрос:

У меня есть таблица с именем Tasks, в которой есть следующие столбцы: автор, ответственный и наблюдатели, все они являются FKS идентификаторов пользователей, которые расположены в таблице Users. И у меня есть таблица, представляющая отношение «многие ко многим» между пользователями и задачами, которая содержит только два столбца: task_id и user_id пользователя. Я использую @Query из Spring boot для выбора всех строк из задач. Моя проблема в том, что я хочу выбрать все задачи, в которых в настоящее время авторизованный пользователь является наблюдателем.

Моя модель задачи:

 @Entity
@Table
public class Task {

private String title;

private String description;

@Column(name = "delete_status")
private Boolean deleteStatus;

@OneToOne
@JoinColumn(name = "task_status_id")
private TaskStatus status;

@OneToMany(mappedBy = "task")
@LazyCollection(LazyCollectionOption.FALSE)
private List<Comment> comments;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name = "due_date")
private Date dueDate;

@ManyToOne
@JoinColumn(name = "author_id", updatable = false)
private User author;

@ManyToOne
@JoinColumn(name = "responsible_id")
private User responsible;

@JsonManagedReference
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "observers_users",
        joinColumns = {@JoinColumn(name = "observers_id", referencedColumnName = "id")},
        inverseJoinColumns = {@JoinColumn(name = "users_id", referencedColumnName = "id")})
@LazyCollection(LazyCollectionOption.FALSE)
private List<User> observers;
}
  

Мой запрос:

 @Query("FROM Task t WHERE t.observers = ?1 ORDER BY t.id DESC")
List<Task> findWhereUserObserver(
        @Param("observers") List<User> user
);
  

Независимо от того, как я изменяю запрос, я продолжаю получать ту же ошибку: значение параметра [User (…)] не соответствует ожидаемому типу [java.util.Коллекция (n / a)]

Поскольку t.observers — это тип списка, я не могу понять, как использовать его в SQL-запросе в условии WHERE. Я хочу найти моего текущего авторизованного пользователя в этом списке, но не понимаю, как мне это сделать в SQL-запросе. Или я должен вообще?

Комментарии:

1. Вы используете in предложение, для этого требуется коллекция, которую вы передаете в одном User .

2. привет, я знаю это, дело в том, что вы не можете этого сделать: ?1 в t.observers.

3. Вместо одного пользовательского прохода в коллекции, даже если она содержит один.

4. Я тоже это сделал, та же ошибка. t.observers = ListUsers. t.observers в ListUsers

5. Используйте MEMBER OF вместо IN или = . Таким образом, запрос должен быть FROM Task t WHERE :user ELEMENT OF t.observers ORDER BY t.id DESC . Предполагая, что вы используете один элемент.

Ответ №1:

Ну, когда вы говорите sth. как и T.НАБЛЮДАТЕЛИ В это означает, что у вас будет более одного наблюдателя в списке, таком как В (Пользователь1, Пользователь2, Пользователь3) и т.д. Но у вас есть только 1 пользователь. Проверка SQL В инструкцииhttps://www.w3schools.com/sql/sql_in.asp

Комментарии:

1. привет, я знаю это, дело в том, что вы не можете этого сделать: 1? в t.observers. Я хочу найти задачи, в которых пользователь существует в наблюдателях, но я не знаю, как это сделать, поэтому я задал вопрос

Ответ №2:

Я знаю, что уже немного поздно, но… Вы должны выполнить поиск в коллекции T.НАБЛЮДАТЕЛИ через левое соединение. Вот что нужно сделать:

«ВЫБЕРИТЕ t Из задачи t LEFT JOIN t.observers o, где o.id = ?1 ПОРЯДОК ПО t.id DESC»)