我有一个对象(BlogPost),它包含一个M:N元素集合(标签).
@H_301_2@如何查询一个对象(BlogPost),其中至少有一个对象的标签与一组标签(由用户定义)中的元素与JPA2(Hibernate)匹配.
– BlogPost的标签集合.
– 我搜索的集合 @H_301_2@我尝试从Post p中选择p,其中p.tags在(:tags)中但它不起作用,因为我的帖子实体只有一个标签. @H_301_2@那我该怎么做呢? @H_301_2@我的BlogPost实体看起来像这样.它有几个标签.
findBlogPostWithAtLeastOneMatchingTag(Collection<Tag> tags){ ???? }@H_301_2@我的主要问题是,我实际上需要比较两个标签集合:
– BlogPost的标签集合.
– 我搜索的集合 @H_301_2@我尝试从Post p中选择p,其中p.tags在(:tags)中但它不起作用,因为我的帖子实体只有一个标签. @H_301_2@那我该怎么做呢? @H_301_2@我的BlogPost实体看起来像这样.它有几个标签.
@Entity public class BlogPost{ /** The tags. */ @ManyToMany() @NotNull private Set<Tag> tags; @NotBlank private String content; ... }@H_301_2@解决方案不能是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();@H_301_2@此解决方案使用应由JPA实现生成的canonical MetaModel类BlogPost_和Tag_.