加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何查询与JPA2的M:N关系?

发布时间:2020-12-14 05:44:20 所属栏目:Java 来源:网络整理
导读:我有一个对象(BlogPost),它包含一个M:N元素集合(标签). 如何查询一个对象(BlogPost),其中至少有一个对象的标签与一组标签(由用户定义)中的元素与JPA2(Hibernate)匹配. findBlogPostWithAtLeastOneMatchingTag(CollectionTag tags){ ???? } 我的主要问题是,
我有一个对象(BlogPost),它包含一个M:N元素集合(标签).

如何查询一个对象(BlogPost),其中至少有一个对象的标签与一组标签(由用户定义)中的元素与JPA2(Hibernate)匹配.

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

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

我尝试从Post p中选择p,其中p.tags在(:tags)中但它不起作用,因为我的帖子实体只有一个标签.

那我该怎么做呢?

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

@Entity
public class BlogPost{

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

    @NotBlank
    private String content;

    ...
}

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

解决方法

如果你喜欢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();

此解决方案使用应由JPA实现生成的canonical MetaModel类BlogPost_和Tag_.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读