2011-12-14 92 views
0

我在使用LIKE expresion搜索文章標題,正文和標籤名稱中的關鍵字。文章和標籤定義使用一對多的關係遍歷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)  

但它沒有給出正確的結果;並非所有文章都顯示出來。

我是迭代的權利,通過與的標籤,或者我需要指定LEFT JOIN?任何幫助將不勝感激。

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錯了 - 它應該在 where條款中,而不是 select的一部分。我很驚訝你沒有得到例外 。 (wrong:見Mikko的評論)。

但是在您的情況下,您不能使用in,因爲您要使用like運算符。

我會嘗試這樣的事:

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

他在FROM子句中使用IN操作符,它是語法正確。 JPA 2.0規範:「集合成員聲明的標識變量是使用特殊運算符聲明的,保留標識符爲IN,IN運算符的參數是集合值路徑表達式。」 – 2011-12-14 07:59:57