Операнд должен содержать 2 столбца (ов) при извлечении данных через JPQL с помощью предложения IN & MEMBER OF - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь получить данные о доступности сотрудников, создавая запрос. Я использовал аннотацию @ElementCollection для сопоставления навыков и daysAvailable, в котором данные хранятся в другой таблице.

TypedQuery<Employee> query = entityManager.createQuery("select e from Employee e where :day MEMBER OF e.daysAvailable and :list MEMBER OF e.skills ", Employee.class);//
        query.setParameter("day", dayOfWeek);
        query.setParameter("list", employeeRequestDTO.getSkills());
        List<Employee> list = query.getResultList();

Я пытаюсь передать набор в свой запрос. Если в наборе есть только один элемент, то запрос работает, но если больше 1, он не может извлечь. Я попытался использовать e.skills в (: list) вместо : список MEMBER OF e.skills . Но все равно не повезло !!


@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;

// Getters & Setters

Это домен, который я создал и теперь хочу получить всех сотрудников, которые доступны в определенный день и имеют определенные навыки. Я создал запрос для этого, но он показывает ошибку - java. sql .SQLException: операнд должен содержать 2 столбца (ов)

Это сгенерированный запрос -

select  * from employee e where ( 'TUESDAY' in ( select d.days_available from days d where e.id=d.emp_id)) and (( 'PETTING','FEEDING' ) in (select s.skills from skills s where e.id=s.emp_id));

Есть предложения?

1 Ответ

0 голосов
/ 15 апреля 2020

В JPQL MEMBER OF принимает один аргумент и проверяет, содержится ли он в предоставленной коллекции.

Для получения более подробной информации обратитесь к Руководству пользователя Hibernate .

Попробуйте вместо этого запрос:

select e 
from Employee e 
join e.skills s
where 
    :day MEMBER OF e.daysAvailable  and
    s in :list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...