Pum*_*ine 6 java hibernate jpql criteria-api jpa-2.0
我有一个对象(BlogPost),它包含一个M:N元素集合(标签).
如何查询一个对象(BlogPost),其中至少有一个对象的标签与一组标签(由用户定义)中的元素与JPA2(Hibernate)匹配.
findBlogPostWithAtLeastOneMatchingTag(Collection<Tag> tags){ ???? }
Run Code Online (Sandbox Code Playgroud)
我的主要问题是,我实际上需要比较两个标签集合: - 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;
...
}
Run Code Online (Sandbox Code Playgroud)
解决方案不能是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();
Run Code Online (Sandbox Code Playgroud)
此解决方案使用规范的MetaModel类BlogPost_,Tag_并且应该由JPA实现生成.
| 归档时间: |
|
| 查看次数: |
2546 次 |
| 最近记录: |