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

Posted

技术标签:

【中文标题】如何使用 JDBC 模板更新字符变化数组【英文标题】:How to update an character varying array using JDBC Template 【发布时间】:2017-09-06 08:06:38 【问题描述】:

我正在尝试使用 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 数组类型(不是字符串数组)。感谢任何帮助。

【问题讨论】:

更新问题\现在可以了吗? 代码试图做什么?在某些情况下,是否需要将一些文本附加到用户 ID 中?这听起来真的很奇怪;如果用户 id 在其他表中用作外键,您还应该预料到会违反参照完整性。 @MickMnemonic 他当然知道。因为idvarchar[],而不是varchar。它一个数组。当然他真的不应该使用数组,但这可能不是他设计中最糟糕的部分。 @MickMnemonic column id is character varying[]. @MickMnemonic 我真的不知道该说什么。我也不会设计这样的数据库,但也许他会学到宝贵的一课,从长远来看,数组列并不是很方便。 【参考方案1】:

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

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

【讨论】:

我没有使用连接。我使用的是连接池 HikariCP 您没有使用连接?你知道“连接池”中的“连接”这个词是什么意思吗? 我不处理连接如果我们使用 JDBC 模板,它会打开和关闭连接。 你需要做更多的研究。从PreparedStatement 获取连接。 我认为这不是一个好主意,因为单个查询需要两个连接。如果我可以将字符串转换为 SQL 数组,然后如果我可以更新准备好的语句,那就是我猜不错

以上是关于如何使用 JDBC 模板更新字符变化数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JDBC 更新/更改 H2 数据库中的用户帐户名?

如何使用 Spring JDBC 模板查询查询 Double

如何使用 C++ 模板实现 int、string、float 和 date 对象的数组?

如何分配所有的“?”使用 JDBC 模板中的对象数据?

如何在 jdbc 模板中实现 RowMapper

如何更新 Ember 模板中辅助主体内的变量