2011-12-14 66 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