SQL-запрос в гибернации для включения подмножеств, но исключения надмножеств

#java #sql #database #hibernate #jpa

#java #sql #База данных #гибернация #jpa

Вопрос:

У меня есть две сущности:

  • Games (пусть у него есть объекты a , b )
  • Tags (пусть у него есть объекты 1 , 2 )

и таблица соединений GameTags , которая имеет отношение «один ко многим» с обеими сущностями ( Games amp; Tags ). Это означает, что если a связано с 1 и 2 и b связано с 1 , то в таблице будет три записи GameTags .

Проблема:

Учитывая, что у меня есть список тегов поиска ( ST ), я хочу найти все игры, теги которых являются подмножеством ST или равны ST .

Наивный подход:

Наивный подход, который я рассмотрел, — выполнить все 2^n -1 SQL-запросы и для всех результирующих игр найти все теги и сравнить с ST , чтобы исключить игры, которые не являются подмножеством ST . Однако я считаю, что должен быть лучший способ обработки наборов в SQL.

Ответ №1:

Вы должны использовать подзапрос exists, подобный этому:

 select g from Games g
where exists (
    select 1 
    from g.tags t
    where t.id in :tagIds
)