Данные Spring JPA: запрос к ElementCollection

У меня есть следующий класс с именем UserInterest. Отсюда следует следующее определение:

@Table(name = "user_interests")
public class UserInterest {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_interest_pk_generator")
  @SequenceGenerator(name = "user_interest_pk_generator", sequenceName = "user_interest_id_seq", 
  allocationSize = 1)
  @Column(name = "user_interest_id")
  private int userInterestId;

  @Column(name = "user_id", nullable = false)
  private int userId;

  @ElementCollection
  @CollectionTable(name = "user_interest_ids")
  @Column(name = "interest_id")
  private List<Integer> interests;
}

JPA автоматически создает встроенную таблицу user_interest_ids, таблицу-коллекцию.

Этот класс работает нормально, интерес пользователя сохраняется корректно.

Теперь мне нужно отфильтровать пользователей по определенному списку интересов.

Допустим, у меня есть следующий список user_interest:

введите здесь описание изображения

И CollectionTable выглядит так:

введите здесь описание изображения

Я хочу найти пользователей, у которых есть interest id 3. В панели pgAdmin PostgreSQL запрос на фильтрацию interest_id =3 возвращает следующую таблицу:

введите здесь описание изображения

Я попытался реализовать этот запрос фильтра в Spring Data JPA в собственном запросе с помощью запроса внутреннего соединения:

@Query(value = "select user_id from user_interests inner join user_interest_ids on interest_id = ?1", nativeQuery = true)
Set<Integer> findUsersByInterest(int interestID);

Этот внутренний запрос на соединение возвращает всех пользователей, а не только пользователей с идентификатором интереса 3.

Я попытался найти некоторые полезные ресурсы здесь, в переполнении стека и других источниках в Интернете, к сожалению, мне не удалось найти полезные ресурсы для моей проблемы.

Не могли бы вы дать мне несколько советов, как реализовать этот запрос как собственный запрос в Spring Data JPA или некоторые ссылки на другие источники, где я мог бы найти полезный ресурс для моего вопроса.

Я действительно ценю твою помощь.


person Mamun    schedule 18.01.2021    source источник
comment
вам нужно левое внешнее соединение, чтобы возвращать строки, которые не имеют объединенной записи в таблице соединений. Исследуйте внутренние и внешние соединения.   -  person K.Nicholas    schedule 19.01.2021
comment
Отвечает ли это на ваш вопрос? JPA JPQL: выберите элементы, когда атрибут элемента (список/набор) содержит другой элемент   -  person Jens Schauder    schedule 19.01.2021
comment
@K.Nicholas, спасибо за ответ. Я пытался присоединиться к пользователю left или left outer, но это не сработало. Запрос следует такой: @Query(value = "select user_id from user_interests left outer join user_interest_ids on user_interest_ids.interest_id = ?1", nativeQuery = true) - этот запрос не сработал. Наверное, мне нужно разобраться с таблицей соединений.   -  person Mamun    schedule 19.01.2021
comment
@JensSchauder, большое спасибо за предложение ссылки. Я попробовал оба ответа из этого потока, но, похоже, мой собственный запрос не распознает MEMBER или в следующем запросе ` @Query (значение = выберите отдельный user_id из user_interests d внутреннее соединение d.user_interest_ids a где a.id = ?1, nativeQuery = true), the query shows an error for где после слова '(', CROSS, FULL, INNER, JOIN, LEFT, NATURAL, ON, RIGHT, TABLESAMPLE or USING expected, got 'where.   -  person Mamun    schedule 19.01.2021
comment
@JensSchauder, я проверил Пример Spring Data JPA для использования JPQL и Native Query. Кажется, нет никакой разницы в отношении JPQL или Native Query, когда мы пишем команду SQL с тегом @query в Spring Data JAP. Я не понимаю, почему в моем @query это вызывает ошибку.   -  person Mamun    schedule 19.01.2021
comment
Что ж, я согласен с просмотром соединения. Я признаю, что не пытался отладить пример, хотя вы подробно описали его. Просто когда я вижу, что одна из строк не возвращена, мой goto всегда сортирует внешнее соединение. В основном мне кажется, что вам нужно открыть инструмент запросов и поработать над тем, чтобы запрос sql дал вам то, что вы хотите, чтобы вы правильно поняли проблему и sql.   -  person K.Nicholas    schedule 19.01.2021