2011-12-14 7 views
0

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) 

答えて

1

まずのためにうまく働いたソリューションでした、あなたは間違っ inを使用しています - selectの一部ではなく、 where句に含める必要があります。私はあなたが例外を得ていないことに驚いています 。 (wrong:Mikkoのコメントを参照してください)。

like演算子を使用したいので、あなたの場合は、inを使用することはできません。

は、私はこのような何かしようとするだろう。彼は、FROM句でIN演算子使用している

select a from Article a join a.tagList tag where a.status = :status and 
    (a.title like :pattern or a.body like :pattern or tag.name like :pattern) 
+0

を、そしてそれが構文的に正しいです。 JPA 2.0仕様: "コレクションメンバ宣言の識別変数は、特殊演算子である 予約識別子INを使用して宣言されています。IN演算子の引数はコレクション値のパス式です。 –

+0

ご回答いただきありがとうございました。 あなたのソリューションで私は以前と同じ結果を得ました。別のものを追加して結合を左の結合で置き換えたIm正しい結果が得られました(少なくとも私はそう望みます) よろしくお願いいたします – hari

+1

@Mikko thanks 、それを知らなかった。 (そして「in」はあまりグーグルではない)。 – itsadok