Я работаю над следующей таблицей:
@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
, потому что есть некоторые дополнительные спецификации, использующиеэтот подход.