次のエンティティがあります。
@Entity
public class Article{
@Id
private String id;
@ManyToMany(cascade = CascadeType.PERSIST)
private Set<Tag> tags;
//non-relevant code
}
@Entity
public class Tag{
@Id
private String id;
@Basic
@Column(nullable = false, unique = true, length = 32)
private String name;
//non-relevant code
}
共通のタグArticle
を持つすべてのエンティティを効率的に見つけるにはどうすればよいですか?set
単純なアプローチは、それぞれに属するすべての記事を見つけてから、すべての記事セットの をtag
返すことです。intersection
何かのようなもの:
public Set<Article> findByTags(Set<Tag> tags){
Set<Article> result = new HashSet<>();
if(tags.isEmpty()){
return result;
}
Iterator<Tag> i = tags.iterator();
result.addAll(i.next().getArticles());
while(i.hasNext() && !result.isEmpty()){
result.retainAll(i.next());
}
return result;
}
私の質問は、「このような DB からおそらくすべての記事を取得する必要がない、これを行うためのより効率的な方法はありますか? JPQL クエリを使用するか、CriteriaBuilder
(以前は使用したことがありません)」