我使用的是Spring JdbcTemplate,但是我遇到了一个问题,我的查询更新了一个实际上是int数组的列。数据库是postgres 8.3.7。下面是我使用的代码:
public int setUsersArray(int idUser, int idDevice, Collection<Integer> ids) {
int update = -666;
int[] tipi = new int[3];
tipi[0] = java.sql.Types.INTEGER;
tipi[1] = java.sql.Types.INTEGER;
tipi[2] = java.sql.Types.ARRAY;
try {
update = this.jdbcTemplate.update(setUsersArrayQuery, new Object[] {
ids, idUser, idDevice }, tipi);
} catch (Exception e) {
e.printStackTrace();
}
return update;
}
查询为“更新表名设置数组列=?其中id用户=?和id设备=?"。我得到了以下异常:
数据完整性违规异常:准备好的语句回调;SQL [更新acotel_msp.users_mau设置拒绝子客户端=?,其中id_users =?和id_mau =?];列索引超出范围:4、列数:3.;嵌套的异常是org.postgresql.util.列索引超出范围:4、列数:3.
原因是:org.postgresql.util.列索引超出范围:4、列数:3.
我已经看过了spring jdbc模板文档,但是我找不到任何帮助,我会继续找的,不管怎样,有人能给我指一下正确的方向吗?谢谢!
编辑:
很明显命令错了,是我的错...
我尝试了你的两种解决方案,在第一种情况下,我有这样的:
org.springframework.jdbc.BadSqlGrammarException:准备好的语句回调;SQL语法错误[更新用户设置denied_sub_client =?,其中id_users =?和id_device =?];嵌套异常是org.postgresql.util.无法将java.util.ArrayList的示例强制转换为类型Types.ARRAY
尝试第二个解决方案,我有这个:
org.springframework.jdbc.BadSqlGrammarException:准备好的语句回调;SQL语法错误[更新用户设置denied_sub_client =?,其中id_users =?和id_device =?];嵌套异常是org.postgresql.util.无法强制转换[Ljava.lang.Object;类型类型.阵列
我想我需要一个java.sql.Array的示例,但是我如何使用JdbcTemplate创建它呢?
7条答案
按热度按时间x4shl7ld1#
经过多次尝试,我们决定使用一个小助手ArraySqlValue来为Java数组类型创建Spring SqlValue对象。
用法是这样的
ArraySqlValue也可以在MapSqlParameterSource中使用,以便与NamedParameterJdbcTemplate一起使用。
此代码在公共域中提供
mpgws1up2#
eqqqjvef3#
这个解决方案是一种使用PostgreSQL内置函数的变通方案,它对我来说确实有效。
reference blog
1)将字符串数组转换为逗号分隔的字符串
如果您使用Java8,这非常简单。其他选项是here
2)PostgreSQL内置函数字符串到数组()
您可以找到其他PostgreSQL数组函数here
p4tfgftt4#
到目前为止,我发现的最简洁的方法是首先将
Collection
转换为Integer[]
,然后使用Connection
将其转换为Array
。这基于文档中的信息:https://jdbc.postgresql.org/documentation/server-prepare/#arrays
z5btuh9x5#
参数类型和参数不匹配。
尝试更改参数类型顺序
或使用
看看是否有效
ddrv8njm6#
http://valgogtech.blogspot.com/2009/02/passing-arrays-to-postgresql-database.html解释了如何创建java.sql.Array postgresql基本上Array.getBaseTypeName应该返回int和Array.toString应该返回“{1,2,3}”格式的数组内容
创建数组后,您可以使用**preparedstatement.setArray(...)**从PreparedStatementCreator设置它,例如
祝你好运。
6uxekuva7#