如何在Hibernate Criteria中实现PostgreSQL的ANY数组查询?
在Hibernate Criteria中实现PostgreSQL UUID数组的ANY查询
要复现你需要的SQL语句SELECT * FROM commercial_information ci WHERE 'f93064da-5089-4591-a2ed-5f86786daba3' = ANY (ci.prescriber_ids);,直接用原本的builder.equal是行不通的——因为你的path对应的是数组类型字段,而不是单个UUID值。你需要借助Hibernate的CriteriaBuilder.function()来调用PostgreSQL的ANY函数,实现单个UUID与数组元素的匹配判断。
修改你的simpleUuidCriteria方法如下:
protected Predicate simpleUuidCriteria(SimpleFilter<UUID> simpleFilter, Path<?> path, CriteriaBuilder builder) { UUID targetUuid = getSimpleFilterValue(simpleFilter); if (targetUuid != null) { if (EQUALS.equals(simpleFilter.getMatchMode())) { // 生成SQL中的ANY(ci.prescriber_ids)部分 Expression<UUID> anyArrayExpression = builder.function( "any", UUID.class, path ); // 对应SQL中的 '目标UUID' = ANY(...) return builder.equal(targetUuid, anyArrayExpression); } } return null; }
关键说明
builder.function("any", UUID.class, path):这个方法会直接生成PostgreSQL的ANY()函数调用,参数依次是SQL函数名、函数返回值类型(这里是UUID,和数组元素类型一致)、以及要传入函数的数组字段路径。- 最终生成的Predicate会对应你需要的SQL逻辑,判断目标UUID是否存在于
prescriber_ids数组中。
额外注意
确保你的实体类中prescriberIds字段正确映射为PostgreSQL的UUID数组类型,示例映射代码如下:
@Column(name = "prescriber_ids", columnDefinition = "uuid[]") private UUID[] prescriberIds;
内容的提问来源于stack exchange,提问作者hauretax
相关产品推荐
相关产品推荐

