编程语言
首页 > 编程语言> > java – JPA:查找具有一组通用标签的所有文章

java – JPA:查找具有一组通用标签的所有文章

作者:互联网

我有以下实体:

@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
}

如何有效地查找具有一组共同标签的所有文章实体?

天真的方法是找到属于每个标签的所有文章,然后返回所有文章集的交集.就像是:

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(我以前从未使用过它)”

解决方法:

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)

这基本上计算了在接受的标签集中作为标签的文章的标签,并且如果这些标签的数量等于所接受的标签集的大小(意味着集合中的所有标签都是文章的标签) ,返回文章.

标签:criteriaquery,java,jpa,persistence
来源: https://codeday.me/bug/20191002/1843971.html