Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 整数[]列,其中包含JPA CriteriaBuilder中的任何运算符_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 整数[]列,其中包含JPA CriteriaBuilder中的任何运算符

Java 整数[]列,其中包含JPA CriteriaBuilder中的任何运算符,java,spring,hibernate,jpa,spring-data-jpa,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[]")

我在下表中工作:

@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 ...
}
上述方法显然会生成
org.postgresql.util.PSQLException:错误:运算符不存在:integer[]=integer
。如何实现
规范.toPredicate
方法以正确方式获取
员工
实体?在纯SQL中,我可以通过这种方式获取所有需要的行(例如对于
skillid
=[1,2]):


但是,我必须使用
CriteriaBuilder
,因为有一些额外的规范使用这种方法。

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


通过这种方式,您将能够构造所需的查询。请注意,这将取决于RDBMS

除非序列化数组,否则无法将其保存到数据库中。这将使它成为一个blob
skillIds
数组,并将其保存到数据库中,不会出现问题。有序列化,但我想知道如何从数据库中获取特定行。使用
JOINS
可以做到这一点。@antoniosss您的意思是:
Join-Join=root.Join(“skillIds”)
toPredicate
中?我如何使用这个连接?就像你做的那样
join(“xxx”).get(“propname”)
,你知道JPA API中的钻取(简单等于谓词)?标准真的,我恐怕不能像@BillyFrost评论的那样在JPAAPI中使用用户标准
public Specification<Employee> attributeListVsList(List<Integer> skillIds) {
    return (root, query, builder) -> {
        Expression<List<Integer>> attributeValuesList = root.get("skillIds");
        return builder.or(attributeValuesList.in(skillIds));
    }
}
SELECT * FROM employees
    WHERE 1 = ANY (skill_ids) AND
          2 = ANY (skill_ids);