JPA:查找所有具有共同标签集的文章
Posted
技术标签:
【中文标题】JPA:查找所有具有共同标签集的文章【英文标题】:JPA: Find all articles that have a common set of tags 【发布时间】:2014-02-08 10:15:09 【问题描述】:我有以下实体:
@Entity
public class Article
@Id
private String id;
@ManyToMany(cascade = CascadeType.PERSIST)
private Set<Tag> tags;
//non-relevant code
@Entity
public class Tag
@Id
private String id;
@Basic
@Column(nullable = false, unique = true, length = 32)
private String name;
//non-relevant code
我怎样才能有效地找到所有Article
具有共同标签set
的实体?
朴素的做法是找到属于每个tag
的所有文章,然后返回所有文章集的intersection
。比如:
public Set<Article> findByTags(Set<Tag> tags)
Set<Article> result = new HashSet<>();
if(tags.isEmpty())
return result;
Iterator<Tag> i = tags.iterator();
result.addAll(i.next().getArticles());
while(i.hasNext() && !result.isEmpty())
result.retainAll(i.next());
return result;
我的问题是“有没有更有效的方法来做到这一点,不需要从数据库中获取所有文章,比如这篇文章?也许通过JPQL 查询或使用CriteriaBuilder
(我以前从未使用过)"
【问题讨论】:
【参考方案1】:select a from Article a where :numberOfTags =
(select count(distinct tag.id) from Article a2
inner join a2.tags tag
where tag in :tags
and a = a2)
这基本上计算了文章的标签是接受的标签集中的标签,如果这样的标签的数量等于接受的标签集的大小(意味着集合中的所有标签都是标签的标签)文章),返回文章。
【讨论】:
以上是关于JPA:查找所有具有共同标签集的文章的主要内容,如果未能解决你的问题,请参考以下文章