Spring (Спецификация) - Как создать Criteria Builder со связью и коллекцией manyToMany - PullRequest
0 голосов
/ 01 марта 2020

У меня проблема с поиском решения для спецификаций пружин со списком объектов и связью @ManyToMany. У меня есть класс сотрудников, у которого есть список навыков:

@Entity
public class EmployeeEntity {
    @ManyToMany
    @JoinTable(name = "employee_skill",
        joinColumns = {@JoinColumn(name = "employee_id")},
        inverseJoinColumns = {@JoinColumn(name = "skill_id")})
    private List<SkillEntity> skills;
}

public class SkillEntity {
    @Column(name  = "skill_name")
    private String skillName;
}

Я хочу найти сотрудников, которые имеют навыки, которые хранятся в моем списке пользовательских навыков:

public static Specification<EmployeeEntity> employeeHasSkills(List<String> skills) {
    return (root, query, cb) ->{
        return root.get("skills").get("skillName").in(skills);
    };
}

Список навыков имеет skillNames как String. Поэтому я пытаюсь отобразить навыки для skillName. Из c это не работает. Есть идеи? Я ищу решение без метамодели JPA.

1 Ответ

1 голос
/ 02 марта 2020

root.get("skills") возвращает List<Skill>. Не имеет skillName.

Вы должны попробовать что-то вроде этого

public static Specification<EmployeeEntity> employeeHasSkills(List<String> skills) {
    return (root, query, cb) ->{
        Join<EmployeeEntity, SkillEntity> skill = root.join("skills", JoinType.LEFT);
        return skill.get("skillName").in(skills);
    };
}
...