우리는 2 개의 Entites를 가지고 있습니다 : Employee는 언어 집합을 말하고 Employee가 수행하는 Review를 말합니다.enums의 ElementCollection을 QueryDSL 및 최대 절전 모드와 비교
public enum Language {
DE,
EN,
;
}
이제 우리는 이미 완전히 덮여 특정 직원의 언어가 있다면 리뷰의 특정 부분 집합에 대해 조회 할 :
@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;
}
언어는 단순한 열거입니다. (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_ 언어를 경로에 추가 할 수 있습니까? Afaik는 QLanguage를 사용하고 e.languages에 언어를 사용하는 경우에만 작동합니다. @Embeddable을 Language에 추가하여 생성 할 수 있지만, 최대 절전 모드에서는 Language에 args가없는 생성자가 누락되었다고 불평합니다.