【问题标题】:Facing issue with "org.postgresql.util.PSQLException: ERROR: column "b00e5nh0la" does not exist"面临“org.postgresql.util.PSQLException:错误:列“b00e5nh0la”不存在”的问题
【发布时间】:2019-10-18 07:31:18
【问题描述】:

我有一张如下表

 Column   |          Type          | Collation | Nullable | Default 
------------+------------------------+-----------+----------+---------
 asin       | character varying(255) |           | not null | 
 appdetails | json                   |           |          | 

下面是向“appcredential_info”表中插入值的java代码

String json = "{ \"asin\": "+values.get(0)+", \"appdetails\": { \"app_name\": "+values.get(1)+", \"app_username\":"+values.get(2)+",\"app_password\": "+values.get(3)+",\"service_provider_uname\":"+values.get(4)+",\"service_provider_password\":"+values.get(5)+",\"marketplace\":"+values.get(6)+" } }";
        System.out.println(json);
        PGobject jsonObject = new PGobject();
        jsonObject.setType("json");
        jsonObject.setValue(json);
        String sql = "INSERT INTO appcredential_info VALUES ("+values.get(0)+", ?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setObject(1, jsonObject);
        System.out.println(ps);
        ps.executeUpdate();
        System.out.println("Values Inserted Successfully");
}

但我面临着coloumn不存在的问题。在错误提及列中是 values.get(0) 方法的值。

谁能帮助我为什么会遇到这个问题并可以提出一个最好的方法来解决这个问题?

【问题讨论】:

  • 为什么要硬编码一个参数,而对第二个参数使用通配符??我敢打赌,一旦您正确使用PreparedStatement,并使用setXXX 提供所有参数,您的问题就会消失。
  • 卡亚曼是对的。也为第一个参数使用适当的参数。
  • 第一列是 varchar,第二列是 json。我将类型值设置为“json”。这就是我这样做的原因。
  • @user3782636 我不知道你想说什么,但你的代码是错误的。对这两个参数使用 ? 占位符。 varchar 参数可以通过.setString() 提供。
  • @Kayaman,我的数据库中只有两个参数,一个是 varchar,另一个是 json。由于 Typevalue 设置为 json,因此我对字符串值进行了硬编码。如果有其他方法可以满足我的要求。请告诉我。

标签: java json postgresql jdbc


【解决方案1】:

也为第一列使用适当的参数。而且你也不需要 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))";

【讨论】:

  • 我收到错误为“org.postgresql.util.PSQLException:错误: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_provider_password":NA,"marketplace":US } }' as json))" ...你能帮帮我吗?
  • 那么您没有创建正确/有效的 JSON 字符串。获取生成的 JSON 字符串并将其粘贴到:jsonformatter.curiousconcept.com,您将看到错误
【解决方案2】:

我认为你应该修改你的 sql 字符串:

String sql = "INSERT INTO 'appcredential_info' ('asin', 'appdetails')
VALUES ('" + values.get(0) + "', ?);";

【讨论】:

  • 如果您为所有列提供值,则无需显式指定列。
  • 我认为他在第一个值中缺少单引号。如果他使用 PreparedStatement 提供该参数,那么应该没问题
  • 引用问题是根本原因,但是您的代码显示了错误的使用 PreparedStatement 的方式,因为它内联了参数。
  • 您不能在 SQL 中将标识符括在单引号中。 'asin' 是字符串常量,而不是列名。但总的来说我同意:指定列名是很好的编码风格。
  • @HưngChu MySQL 在这方面偏离了 SQL 标准。但除了不正确的引用用法之外,这是一个不好的建议,因为 OP 已经在使用准备好的语句,所以他应该正确使用参数。
猜你喜欢
  • 1970-01-01
  • 2020-01-07
  • 2018-01-28
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 2015-10-09
相关资源
最近更新 更多