迭代JPQL中的集合

时间:2011-12-14 05:24:49

标签: java jpa jpql

我正在尝试使用LIKE expresion在文章标题,正文和标记名称中搜索关键字。文章和标签是使用一对多关系定义的

以下是我班级的代码段:

@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 JOIN ?任何帮助将不胜感激。

事先提前

如果有人会遇到这种问题,这就是我的案例

的解决方案
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 个答案:

答案 0 :(得分: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)
相关问题