7

要素(タグ)のM:Nコレクションを含むオブジェクト(BlogPost)があります。

少なくとも1つのタグがJPA2(Hibernate)を持つタグのセット(ユーザーによって定義された)の要素と一致するオブジェクト(BlogPost)を照会する方法。

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

私の主な問題は、実際には2つのタグのコレクションを比較する必要があるということです。-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ではない)も問題ありません。

4

3 に答える 3

8

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();

このソリューションは、正規のMetaModelクラスBlogPost_を利用します。これTag_は、JPA実装によって生成される必要があります。

于 2012-07-05T16:59:34.623 に答える
2

アプローチ1:

SQLでは、次のようになります。

SELECT p FROM Post p WHERE (p.tags INTERSECT :tags IS NOT EMPTY);

次に、を適用し@SqlResultSetMappingます。

アプローチ2:

使用Criteria APIして開始することもできますが、次のようにループを作成しますCollection<Tag> tags

* make a union of single query results from `Select p from Post p where p.tags in(:tags)`;
* take distinct over result of union.

クエリはサーバー側になり、Javaで汚い作業をする必要はありません。

于 2012-07-05T14:55:00.117 に答える
1

あなたは次のようなことをすることができます

Post t where t.tag inからtを選択します(Post p from p.id =:idからp.tagを選択します)

idは現在の投稿のIDです。基本的に、現在の投稿のタグにあるタグを持つ投稿を選択しています。

于 2012-07-02T16:14:06.930 に答える