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:查找所有具有共同标签集的文章的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查找具有共同成员的集合(关系除法)

如何查找具有特定数据属性的所有标签?

XPath:查找具有特定属性的所有已知标签[重复]

具有 Oracle 标签安全性的 JPA/Hibernate

查找包含特定多个标签的所有产品

从多个指标(相同的标签集,不同的名称)绘制 rate() 时如何避免“向量不能包含具有相同标签集的指标”错误