#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»)