我正在尝试使用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)
答案 0 :(得分:1)
首先,您使用。 ( wrong :请参阅Mikko的评论。)in
错误 - 它应该在where
子句中,而不是select
的一部分。我很惊讶你没有得到例外
但在您的情况下,您无法使用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)