Java 面对“问题”;org.postgresql.util.PSQLException:错误:列";b00e5nh0la“;“不存在”;
我有一张如下的桌子Java 面对“问题”;org.postgresql.util.PSQLException:错误:列";b00e5nh0la“;“不存在”;,java,json,postgresql,jdbc,Java,Json,Postgresql,Jdbc,我有一张如下的桌子 Column | Type | Collation | Nullable | Default ------------+------------------------+-----------+----------+--------- asin | character varying(255) | | not null | appdetails | json
Column | Type | Collation | Nullable | Default
------------+------------------------+-----------+----------+---------
asin | character varying(255) | | not null |
appdetails | json | | |
下面是将值插入表“appcredential\u info”的java代码
但我面临的是一个问题,因为Column不存在。在“错误提及”列中,是values.get(0)方法的值
有谁能帮我解释一下为什么会出现这个问题,并提出一个最好的解决方法吗?我认为您应该修改您的sql字符串:
String sql = "INSERT INTO 'appcredential_info' ('asin', 'appdetails')
VALUES ('" + values.get(0) + "', ?);";
对第一列也使用适当的参数。您也不需要PGObject:
String json = ...;
String sql = "INSERT INTO appcredential_info VALUES (?, cast(? as json))";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, values.get(0));
ps.setString(2, json);
ps.executeUpdate();
在INSERT语句中显式定义目标列也是一种很好的编码方式:
String sql = "INSERT INTO appcredential_info (asin, appdetails) VALUES (?, cast(? as json))";
为什么要硬编码一个参数,而对第二个参数使用通配符
?
?我敢打赌,只要您正确使用PreparedStatement
,并使用setXXX
提供所有参数,您的问题就会消失。Kayaman是对的。对第一个参数也使用适当的参数。第一列是varchar,第二列是json。我将类型值设置为“json”。这就是我这么做的原因。@user3782636我不知道你想说什么,但你的代码错了。对这两个参数使用?
占位符。varchar参数可以随.setString()
@Kayaman一起提供,我的数据库中只有两个参数,一个是varchar,另一个是json。由于Typevalue设置为json,所以我硬编码字符串值。如果有其他方法满足我的要求。请让我知道。如果为所有列提供值,则无需显式指定列。这里的要点我认为他在第一个值中缺少单引号。如果他使用PreparedStatement提供该参数,则应该注意引号问题是根本原因,但您的代码显示了使用PreparedStatement
的错误方法,因为它内联了参数。您不能在SQL中用单引号括起标识符<代码>'asin'是字符串常量,而不是列名。但总的来说,我同意:指定列名是一种很好的编码风格。@HưngChu MySQL在这方面偏离了SQL标准。但除了不正确的引号用法之外,这是一个错误的建议,因为OP已经在使用prepared语句,所以他应该正确使用参数。我得到的错误是“org.postgresql.util.psqleexception:error:invalid input syntax for type json”,语法打印方式是“INSERT INTO appcredential_info VALUES('B00E5NH0LA',cast('{“asin”)“:B00E5NH0LA,“appdetails”:{“app_name”:aetv,“app_username”:NA,“app_password”:NA,“service_provider_uname”:NA,“service_password”:NA,“marketplace”:US}}as json”)“…您能帮我一下吗?那么您没有创建正确/有效的json字符串。将生成的json字符串粘贴到中:您会看到错误
String sql = "INSERT INTO appcredential_info (asin, appdetails) VALUES (?, cast(? as json))";