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

如何通过EntityManager.setParameter向原生SQL传入数组参数?

PostgreSQL JSONB查询中通过EntityManager传递数组参数

背景

原可正常运行的SQL查询:

SELECT * FROM elements we WHERE jsonb_exists_all(CAST(we.elements AS jsonb), ARRAY['TEST'])

需要通过EntityManager的setParameter方法传入完整字符串数组(如["TEST", "TEST1", "TEST2"]),而非仅单个元素的数组,但直接使用setParameter会将参数转换为字符串,导致查询逻辑失效。

当前临时解决方案

通过为同一参数键重复赋值的方式临时规避问题:

String queryFromFilter = "SELECT * FROM elements we WHERE jsonb_exists_all(CAST(we.elements AS jsonb), ARRAY[:array])";

Query query = entityManager.createNativeQuery(queryFromFilter, Checklist.class);

return query
        .setParameter("array", "TEST'")
        .setParameter("array", "TEST")
        .getResultList();

正确解决方案

无需手动构建ARRAY[]语法,直接将数组作为参数传入即可,Hibernate会自动适配PostgreSQL的数组类型:

String queryFromFilter = "SELECT * FROM elements we WHERE jsonb_exists_all(CAST(we.elements AS jsonb), :array)";

Query query = entityManager.createNativeQuery(queryFromFilter, Checklist.class);
// 直接传入目标字符串数组
query.setParameter("array", new String[]{"TEST", "TEST1", "TEST2"});

return query.getResultList();

注意事项

  • 确保项目使用的Hibernate方言为PostgreSQL适配版本(如org.hibernate.dialect.PostgreSQLDialect或PostgreSQL10Dialect等)。
  • 如果需要显式指定数组类型,可使用重载的setParameter方法:
    query.setParameter("array", new String[]{"TEST", "TEST1", "TEST2"}, org.hibernate.type.ArrayType.STRING);
    

内容的提问来源于stack exchange,提问作者pawello12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:05:32