我有一个实体,其中有一个整数数组类型的字段。
class User {
@ElementCollection
@Column(name = "`location_ids`", columnDefinition = "int[]")
@Type(ListArrayType.class)
private List<Integer> locationIds;
@Column(name = "`email`")
private String email;
@Column(name = "`deletedAt`")
@Temporal(TIMESTAMP)
private LocalDateTime deletedAt;
}
我想使用 criteria API 将请求的 locationIds 列表与现有数组进行比较。例如,我想检查位置 id 1,2 或 3 是否是“locationIds”数组列的一部分。
final List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(root.get("email"), email));
predicates.add(criteriaBuilder.isNull(root.get("deletedAt")));
List<Predicate> arrayPredicates = new ArrayList<>();
final Expression<List<Integer>> exp = root.get("locationIds");
for (Integer id : locationIdsFromSearchModel) {
arrayPredicates.add(criteriaBuilder.isMember(id, exp));
}
predicates.add(criteriaBuilder.or(arrayPredicates.toArray(new Predicate[0])));
调用抛出错误 “运算符不存在:整数 = 整数[]”
criteriaBuilder.isMember(id, exp)
我抬头一看,似乎我需要对数组进行“任何”操作。我没有找到任何关于如何使用 Criteria API 执行此操作的参考。
isMember
不适用于数组 - 它适用于元素集合 - 存储在单独的表中。
Hibernate 6 添加了对数组类型的支持,更具体地说,Hibernate 6.4 添加了对某些查询函数的支持:https://in.relation.to/2023/10/26/orm-64cr1/
array_contains()
数组是否包含元素 - 例如array_contains(an.array, 1)