2016-11-04 1 views
0

우리는 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가없는 생성자가 누락되었다고 불평합니다.

답변

0

지금까지 우리가 발견 한 유일한 해결책은 @ElementCollection을 제거하고 대신 직원 및 단일 열거 형 값에 대한 참조를 보유하는 EmployeeLanguage 엔티티를 도입하는 것이 었습니다. 이 코드는 현재 언어를 조회하는 것이 가능하다는 차이와 문제의 하나와 같은 DB 스키마를 생성합니다

private BooleanExpression hasAllEmployeeLanguagesCovered (List<Review> reviews, Employee employee) { 
    return new JPASubQuery().from(el) 
     .where(el.employee.eq(employee)) 
     .where(el.language.notIn(
      new JPASubQuery().from(r).join(r.reviewer, e).join(e.languages, el) 
       .where(r.in(reviews)).list(el.language) 
     ) 
     .notExists(); 

}

:

@Entity 
public class Employee { 

    @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL) 
    @Column(nullable = false) 
    @Getter @Setter 
    private Set<EmployeeLanguage> languages; 
} 

@Entity 
public class EmployeeLanguage implements Serializable { 

    @Id 
    @ManyToOne(fetch = FetchType.LAZY) 
    @Getter @Setter 
    private Employee employee; 

    @Id 
    @Column(nullable=false) 
    @Enumerated(EnumType.STRING) 
    @Getter @Setter 
    private Language language; 
} 

이제이 쿼리는 작은 구조 조정 후 작동

관련 문제