Java 如何使用JDBC模板更新字符可变数组

Java 如何使用JDBC模板更新字符可变数组,java,spring,spring-boot,jdbc,Java,Spring,Spring Boot,Jdbc,我正在尝试使用JDBC模板更新postgresql中的字符可变列。我现在使用的方法如下: String id=getId(); String duser=getUser(); //if count is 0 if(count!=0){ final String SQlString="update public.user set id=array_append(id,?) where username= ?; jdbcTemplate.updat

我正在尝试使用JDBC模板更新postgresql中的字符可变列。我现在使用的方法如下:

    String id=getId();
    String duser=getUser();

    //if count is 0
    if(count!=0){
    final String SQlString="update public.user set id=array_append(id,?)  where username= ?;
    jdbcTemplate.update(SQlString,new PreparedStatementSetter() {
    public void setValues(PreparedStatement preparedStatement) throws SQLException {
    preparedStatement.setString(1, id);
    preparedStatement.setString(1, duser);

    }
    });
    }


    //count not equal to zero 
    else
    {
    final String SQlString="update public.user set id = ?  where username=?;
    jdbcTemplate.update(SQlString,new PreparedStatementSetter() {
    public void setValues(PreparedStatement preparedStatement) throws SQLException {
    preparedStatement.setString(1,"'{"+id+"}'");
    preparedStatement.setString(1, duser);

    }
    });
所以基本上,如果count是0,那么我必须添加id,如果不是,那么我必须用现有元素附加数组。但这会使

BADSQL表达式列id为字符变化[],但表达式为 字符变化


但是我知道它是一个字符串,但是如何将它设置为postgresql数组类型(不是字符串数组)。非常感谢您的帮助。

您不能将
PreparedStatement.setString()
用于
varchar[]
(即数组)列。您需要将
setArray()
与包含
字符串的大小为1的
java.sql.Array
一起使用

Connection con = preparedStatement.getConnection();
Array a = con.createArrayOf("varchar", new Object[] {id});
preparedStatement.setArray(1, a);

更新的问题\现在可以了吗?代码试图做什么?在某些情况下,业务需求是否需要向用户id附加一些文本?听起来真的很奇怪;而且,如果用户id在其他表中用作外键,您还应该期望引用完整性受到破坏。@MickMemonic他当然会这样做。因为
id
varchar[]
,而不是
varchar
。这是一个数组。当然,他真的不应该使用数组,但这可能不是他设计中最糟糕的部分。@MickMnemonic
列id是字符变化[]
@MickMnemonic我真的不知道该怎么说。我也不会设计这样的数据库,但也许他会学到一个宝贵的教训,那就是数组列从长远来看不是很方便。我没有使用连接。我使用的是连接池Hikaricpy你没有使用连接?你知道“连接池”中的“连接”是什么意思吗?如果我们使用JDBC模板,我不会处理连接,因为它会正确地打开和关闭连接。你需要做更多的研究。从
PreparedStatement
获取连接。我认为这不是一个好主意,因为一个查询需要两个连接。如果我可以将字符串转换为SQL数组,然后如果我可以更新PreparedStatement,我想这很好