使用JPA传递short[]至PostgreSQL函数时遇类型转换错误
解决PostgreSQL函数调用中Bytea无法转换为smallint的问题
错误根源
Java的short[]数组通过JDBC传递给PostgreSQL时,默认会被识别为二进制类型bytea,而非PostgreSQL的SMALLINT[]数组类型,导致函数调用时触发cannot cast type bytea to smallint的类型转换错误。
解决办法
方案一:使用PostgreSQL原生数组包装类(推荐)
利用PostgreSQL JDBC驱动提供的PGshortArray类,将Java的short[]包装成PostgreSQL可识别的SMALLINT[]类型:
import org.postgresql.util.PGshortArray; List<Object[]> getData(short[] ids) { String strq = "select * from demo(:ids)"; Query q = entitymanager.createNativeQuery(strq); // 用PGshortArray包装short数组,明确对应PostgreSQL的SMALLINT[]类型 PGshortArray pgShortArray = new PGshortArray(ids); q.setParameter("ids", pgShortArray); return q.getResultList(); }
方案二:手动构造数组字符串并显式转换
将short[]转为PostgreSQL数组格式的字符串(如'{1,2}'),在SQL中显式转换为SMALLINT[]:
List<Object[]> getData(short[] ids) { // 构造PostgreSQL数组格式字符串 StringBuilder sb = new StringBuilder("{"); for (int i = 0; i < ids.length; i++) { if (i > 0) sb.append(","); sb.append(ids[i]); } sb.append("}"); String strq = "select * from demo(:ids::smallint[])"; Query q = entitymanager.createNativeQuery(strq); q.setParameter("ids", sb.toString()); return q.getResultList(); }
方案三:修改PostgreSQL函数适配文本参数
如果不想调整Java代码,可修改函数使其接受文本格式的数组参数,内部自动转换:
CREATE OR REPLACE FUNCTION demo(ids TEXT) RETURNS TABLE (processkey bigint) AS $$ BEGIN RETURN QUERY SELECT b.processkey FROM your_table b WHERE id_column = ANY(ids::SMALLINT[]); END; $$ LANGUAGE plpgsql;
之后Java端直接传递数组格式的字符串(如"{1,2}")即可。
内容的提问来源于stack exchange,提问作者Neha
相关产品推荐
相关产品推荐

