столбец integer [] с оператором WHERE ANY в JPA CriteriaBuilder - PullRequest
0 голосов
/ 11 июня 2018

Я работаю над следующей таблицей:

@Entity
@Table(name = "employees")
public class Employee {

    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String fullName;

    @Column(name = "skill_ids", columnDefinition = "integer[]")
    @Type(type = "com.example.utils.IntegerArrayUserType")
    private List<Integer> skillIds;

    // getters, setters ...
}

Столбец skill_ids, как вы видите, является массивом целых чисел.Может содержать разное количество идентификаторов.Я хотел бы получить все Employee сущности, которые skillIds содержат все идентификаторы, предоставленные в массиве, полученные от внешнего интерфейса приложения.Я хотел бы использовать CriteriaBuilder и Specification.toPredicate метод, и я написал что-то вроде этого:

public Specification<Employee> attributeListVsList(List<Integer> skillIds) {
    return (root, query, builder) -> {
        Expression<List<Integer>> attributeValuesList = root.get("skillIds");
        return builder.or(attributeValuesList.in(skillIds));
    }
}

Выше метод явно дает org.postgresql.util.PSQLException: ERROR: operator does not exist: integer[] = integer. Как я могу реализовать метод Specification.toPredicate, чтобы получить Employeeсущности в надлежащем порядке?В чистом SQL я могу получить все требуемые строки таким образом (например, для skillIds = [1, 2]):

SELECT * FROM employees
    WHERE 1 = ANY (skill_ids) AND
          2 = ANY (skill_ids);

Однако я должен использовать CriteriaBuilder, потому что есть некоторые дополнительные спецификации, использующиеэтот подход.

1 Ответ

0 голосов
/ 11 июня 2018

Чтобы решить вашу проблему, вам придется использовать свой пользовательский Criterion.Здесь у вас есть пример, как реализовать свои собственные критерии.

http://learningviacode.blogspot.com/2013/01/creating-new-criterion.html

Таким образом, вы сможете построить требуемый запрос.Имейте в виду, что это будет зависеть от СУБД.

...