2つのエンティティがあります。一連の言語を話す従業員と従業員によって実行されるレビューです。列挙型のElementCollectionsとQueryDSLおよびHibernateの比較
@Entity
public class Employee {
@ElementCollection
@CollectionTable(name = "employeeLanguage"
@Column(name = "language")
@Enumerated(EnumType.String)
private Set<Language> languages;
}
@Entity
public class Review {
@ManyToOne(fetch = FetchType.LAZY)
private Employee reviewer;
}
言語は、単純な列挙型です:
public enum Language {
DE,
EN,
;
}
は今、我々は、彼らがすでに完全にカバーされ、特定の従業員の言語を持っている場合、レビューの特定のサブセットを照会します。 (specificReviewsSubset内のすべてのReview.reviewer.languagesの組合がすべてspecificEmployee.languagesが含まれています)
私たちは、次のクエリでこれをしようとしている:
private BooleanExpression hasAllEmployeeLanguagesCovered (List<Review> reviews, Employee employee) {
return new JPASubQuery().from(e)
.where(e.eq(employee))
.where(e.languages.any().in(
new JPASubQuery().from(r).join(r.reviewer, e)
.where(r.in(reviews)).distinct().list(e.languages.any()
)
.exists();
}
しかし、我々は次のエラーを取得している:
java.lang.IllegalArgumentException: Undeclared path 'e_languages_ed0e7'.
Add this path as a source to the query to be able to reference it.
どのようにe_languagesをパスに追加できますか? Afaikは、私たちがQLanguageを持っていて、e.languagesで言語に参加する場合にのみ動作します。 @EmbeddableをLanguageに追加することでこれを生成することができましたが、その後、休止状態でLanguageのArgsコンストラクターが見つからないという不満がありました。