如何使用 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 他当然知道。因为id
是varchar[]
,而不是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