LIKE表現を使用して記事タイトル、本文、タグ名の中のキーワードを検索しようとしています。ここでは、多くの関係の記事とタグ1を使用して定義されJPQLでコレクションを繰り返す
は私のクラスからのコードスニペットです:
@Entity
public class Article implements Serializable {
@Basic(optional = false)
@NotNull
@Lob
@Size(min = 1, max = 65535)
@Column(name = "body", nullable = false, length = 65535)
private String body;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 250)
@Column(name = "title", nullable = false, length = 250)
private String title;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 9)
@Column(name = "status", nullable = false, length = 9)
private String status;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "articleId", referencedColumnName = "id", nullable = false)
private List<Tag> tagList;
// other attributes and methods
}
またタグクラスは名前属性を持っています。
タグ名の中でキーワードを検索する際に問題があります。私はこのコードを試しました:
SELECT DISTINCT a FROM Article a ,IN(a.tagList) tag
WHERE a.status = :status AND
(a.title LIKE :pattern OR a.body LIKE :pattern
OR tag.name LIKE :pattern)
しかし、それは適切な結果を与えません。すべての記事が表示されるわけではありません。
は私が IN で右タグを反復処理、または私はLEFTを指定する必要がありますを登録しようか?どんな助けもありがとう。事前
で
THX誰もがこの種の問題に直面する場合、これは私の場合、すべての
select distinct a from Article a left join a.tagList tag where a.status = :status and
(a.title like :pattern or a.body like :pattern or tag.name like :pattern)
を、そしてそれが構文的に正しいです。 JPA 2.0仕様: "コレクションメンバ宣言の識別変数は、特殊演算子である 予約識別子INを使用して宣言されています。IN演算子の引数はコレクション値のパス式です。 –
ご回答いただきありがとうございました。 あなたのソリューションで私は以前と同じ結果を得ました。別のものを追加して結合を左の結合で置き換えたIm正しい結果が得られました(少なくとも私はそう望みます) よろしくお願いいたします – hari
@Mikko thanks 、それを知らなかった。 (そして「in」はあまりグーグルではない)。 – itsadok