一尘不染

如何通过JPA2查询M:N关系?

hibernate

我有一个对象(BlogPost),其中包含元素(标记)的M:N集合。

如何查询对象(BlogPost)中至少一个对象的标签与使用JPA2(hibernate)的一组标签(由用户定义)中的元素匹配。

findBlogPostWithAtLeastOneMatchingTag(Collection<Tag> tags){ ???? }

我的主要问题是,我实际上需要比较两个标签集合:-BlogPost的标签集合。-我搜索的收藏集

我尝试了一下,Select p from Post p where p.tags in(:tags)但是它不起作用,因为我的帖子实体具有多个标签。

那我该怎么办呢?

我的BlogPost实体看起来像这样。它有几个标签。

@Entity
public class BlogPost{

    /** The tags. */
    @ManyToMany()
    @NotNull
    private Set<Tag> tags;

    @NotBlank
    private String content;

    ...
}

解决方案不能是JPQL,JPA-Criteria(非Hibernate-Criteria)也可以。


阅读 214

收藏
2020-06-20

共1个答案

一尘不染

如果您喜欢JPA Criteria,这是为您提供的解决方案:

List<Integer> myTagsIds = new ArrayList<Integer> ();
myTagsIds.add(1);
myTagsIds.add(2);

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<BlogPost> cq = cb.createQuery(BlogPost.class);
Root<BlogPost> blogPost = cq.from(BlogPost.class);
SetJoin<BlogPost, Tag> tags = blogPost.join(BlogPost_.tags);
Predicate predicate = tags.get(Tag_.id).in(myTagsIds);
cq.distinct(true);
cq.where(predicate);
TypedQuery<BlogPost> tq = em.createQuery(cq);
return tq.getResultList();

此解决方案利用规范的MetaModelBlogPost_Tag_并且应该由您的JPA实现生成。

2020-06-20