Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 面对“问题”;org.postgresql.util.PSQLException:错误:列";b00e5nh0la“;“不存在”;_Java_Json_Postgresql_Jdbc - Fatal编程技术网

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))";