在JPA CriteriaBuilder中使用WHERE ANY运算符的integer []列

时间:2018-06-11 13:54:53

标签: java spring hibernate jpa spring-data-jpa

我在下表中工作:

@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是整数数组。它可以包含不同数量的ID。我想获取所有Employee个实体skillIds包含从应用程序前端收到的数组中提供的所有ID。我想使用CriteriaBuilderSpecification.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 :(得分:0)

要解决您的问题,您必须使用自定义Criterion。这里有一个如何实现自己的标准的例子。

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

这样您就可以构建所需的查询。请注意,这将取决于RDBMS。