如何通过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
相关产品推荐
相关产品推荐

