Как построить критерии для запроса, где у родительского класса сущности есть два дочерних перечислимых класса, сопоставленных с @ElementCollection - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу создать запрос критерия для родительского класса сущности, содержащего два дочерних класса enum, сопоставленных с @ ElementCollection.


@Entity
public class Employee {

    @Id
    @GeneratedValue
    private long id;

    @Nationalized
    private String name;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "skills", joinColumns = @JoinColumn(name = "emp_id"))
    @Enumerated(EnumType.STRING)
    private Set<EmployeeSkill> skills;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "days", joinColumns = @JoinColumn(name = "emp_id"))
    @Enumerated(EnumType.STRING)
    private Set<DayOfWeek> daysAvailable;

Это запрос, который я создал в MYSQL и хочу создать критерий запроса для этого -

select id,name,days_available,skills from critter.employee e inner join critter.days d on e.id=d.emp_id inner join critter.skills s on e.id=s.emp_id where d.days_available='MONDAY' and s.skills in ('PETTING','SHAVING' );

Я пытался написать самостоятельно, но это не работает -

        List aList = employeeRequestDTO.getSkills().stream().collect(Collectors.toList());

        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
        Root<Employee> fromEmployee = query.from(Employee.class);
        Join<Employee, DayOfWeek> details = fromEmployee.join("daysAvailable");
        Join<Employee, EmployeeSkill> associate = fromEmployee.join("skills");


        TypedQuery<Employee> typedQuery = entityManager.createQuery(query
                .select(fromEmployee)
                .where(builder.and(builder.equal(details.get("daysAvailable"), dayOfWeek), associate.get("skills").in(builder.parameter(List.class, "aList"))))
        );

Может кто-нибудь помочь мне в этом ??

...