java sql错误列的类型是整数,但表达式的类型是字符变化

Posted

技术标签:

【中文标题】java sql错误列的类型是整数,但表达式的类型是字符变化【英文标题】:java sql error column is of type integer but expression is of type character varying 【发布时间】:2015-05-30 13:04:47 【问题描述】:

我已经准备好了sql语句:

PreparedStatement insert_query = db.prepareStatement(String.format(INSERT_QUERY, table, 
                              columns.toString(), placeholder));
System.out.println(insert_query);

结果:

INSERT INTO "article" (article_text, article_id, article_title) VALUES (?, ?, ?) RETURNING article_id

接下来我创建值列表,设置参数并执行插入查询:

ArrayList<String> values = new ArrayList<String>(); -- > is [New CONTENT, 4, New TITLE]
for (int i = 1; i <= values.size(); i++) 
            insert_query.setString(i, values.get(i-1));
        
System.out.println(insert_query);
insert_query.executeUpdate();

我遇到了一个错误:

INSERT INTO "article" (article_text, article_id, article_title) VALUES ('New CONTENT', '4', 'New TITLE') RETURNING article_id

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "article_id" is of type integer but expression is of type character varying

article_id 有问题。我把它作为字符串放在这里。但是,当我在 PostgreSQL 中手动尝试此查询时,一切正常(((

【问题讨论】:

【参考方案1】:

对于article_id,您必须使用insert_query.setInteger 而不是insert_query.setString。当我检查您的异常时,article_id 作为字符串发送到数据库。这就是你有这个例外的原因。

【讨论】:

【参考方案2】:

我发现更好的解决方案是将值列表初始化为:

ArrayList<Object> values = new ArrayList<Object>();

并插入语句对象:

insert_query.setObject(i, values.get(i-1));

【讨论】:

以上是关于java sql错误列的类型是整数,但表达式的类型是字符变化的主要内容,如果未能解决你的问题,请参考以下文章

更改增量表中列的数据类型

Oracle中如何用SQL把字符串转换成整型

将带有数字的列的类型从 varchar 更改为 int

Java LONG 整数类型

检查列数据类型并仅对 Spark SQL 中的整数和小数执行 SQL

创建管道时数据类型不匹配