私は2つのエンティティを持っています:
- エンジニア - タグのセットがあります (たとえば、スキルセット - Java. .NET など)
- 鬼ごっこ
エンジニアは、任意の数のタグを持つことができます。タグは、任意の数のエンジニアに関連付けられます。
@Entity
public class Engineer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(nullable = false, length = 12)
private String id;
@Column(length = 100)
private String name;
@OneToMany(fetch = FetchType.EAGER)
List<Tag> tags;
/* Getters and Setters */
}
@Entity
public class Tag implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private int id;
@Column(length = 50)
private String name;
/* Getters and Setters */
}
ここで、関連付けられたタグのリストを持っているエンジニアを照会したいと思います。たとえば、「「Java」、「Opensource」、「Banking」というタグを持つエンジニアのクエリ」。クエリは、関連付けられたすべてのタグを持つエンジニアを返す必要があります。
1 つのタグを照会できます。
public List<Engineer> searchMindsByTags(String tag) {
Query q = em.createQuery("SELECT e FROM Engineer e WHERE '" + tag
+ "' = ANY(SELECT tag.name FROM e.tags tag)");
return (List<Engineer>) q.getResultList();
}
私が必要とするのは:
public List<Engineer> searchMindsByTags(List<String> tags) {
/* Which query goes here? */
}
この仕事を行うことができる単一のクエリはありますか、それともフィルタリングするために結果を段階的に反復する必要がありますか?