私は次のような JPQL クエリを使用しています。
SELECT s
FROM Sentence s
INNER JOIN s.words sw
WHERE s.date = :date
AND sw IN (:words)
GROUP BY s
HAVING count(sw) = :numberOfWords
SQL では、s.words は多対多のリンク テーブルになります。:word は、照合する単語のコレクションです。:numberOfWords は、コレクション内の単語の数です。
JPQL に慣れていない方のために、同様の SQL がここにあります: 複数の条件に一致するものを見つけるための SQL クエリ
問題が発生していますが、それがデザインの問題なのかクエリの問題なのかわかりません。
したがって、文 (s) と単語 (w) があり、sentence_word (sw) テーブルが 2 つを結合します。たとえば、「群れの番犬は青い」という文と、[ the , cat ] の単語集合の場合、このクエリはこの文を一致として選択します。「the」が 2 回含まれ、「cat」が含まれていないため、誤検知です。
SQLでは、次のようになると思います:
SELECT s.id
FROM sentence s
JOIN sentence_word sw ON ( sw.s_id = s.id )
JOIN word w ON ( w.id = sw.w_id )
WHERE w.word IN ( 'the', 'cat' )
GROUP BY s.id
HAVING COUNT(1) = 2
私が考えることができる最も簡単な解決策は、リンクテーブルで重複を許可しないことです。そのため、この文の の 2 つのリンクではなく、1 つだけです (したがって、リンクテーブルには、文に単語が含まれていることが格納されます。 )。ただし、「the」を何度も含む文を検索したい場合もあると思いますので、このオプションは使用しない方がよいでしょう。
助けてください!
資力
同様の検索とパフォーマンスの良い例をいくつかここで見つけることができます (リンクの回答者に感謝します): How to filter SQL results in a has-many-through relationship