You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:08:28