2017-11-27 9 views
1

を使用してEnumSetの中でテストする方法:列挙値がある場合は、次のように私は財産を持っているJPQL

@Entity 
class Project implements Serializable { 
    @Convert(converter = TypeFlattener.class) 
    @Column(name = "assignable_types") 
    private EnumSet<Type> assignableTypes; 

TypeFlattenerのポイントは、私は基本的には変換し、単純なリストのための正規化を避けたいということですEnumSetカンマ区切りの値をカンマで区切った単純な文字列との比較Enum.name()

ここで問題は、特定のタイプが割り当て可能なタイプのプロジェクトのみをフィルタすることができますか?

私の最善のアプローチは、そのようなものになるだろう:

@NamedQuery(
    name="Project.findByType", 
    query="SELECT p FROM Project p WHERE :t IN p.assignableTypes" 
) 

私は:tのために何を渡すのですか? Stringバージョンは次のとおりですか?これもできますか?

q.setParameter("id", "MAJOR"); 

答えて

2

変換は、データベース表現にのみ影響するため、ここでは問題ありません。 MEMBER OFを使用する以下のクエリが機能するはずです。

TypedQuery<Project> query = em.createQuery(
    "SELECT p FROM Project p WHERE :type MEMBER OF p.assignableTypes", Project.class); 
query.setParameter("type", Type.ONE); 
List<Project> resultMemberOf = query.getResultList(); 
+0

これは甘くて短かった。ありがとう。 – YoYo

関連する問題