java - 如何将数据持久保存到 postgres,而无需转换特定的数据类型

标签 java spring postgresql jdbc

在我的 spring-boot 应用程序中,我从 API 接收 json 数据,并且我需要在没有强类型对象的情况下保留这些数据。

目前,我的代码结构如下:

String sql = "INSERT INTO problem " + "(name, favorite_number, favorite_color) VALUES (?, ?, ?)";

           PreparedStatement ps = c.prepareStatement(sql);

           int counter = 1;
           while( keys2.hasNext() ) {
               String key = (String)keys2.next();

               ps.setObject(counter,  dataValues.get(key));
               counter ++;
           }

ps.executeUpdate();
               ps.close();

目标postgres表的结构是:

name:  string
favorite_number:  int
favorite_color:  string

其中 dataValues 是 JSONObject:

JSONObject dataValues = (JSONObject) configParameters.get(2);

Iterator<?> keys = dataValues.keys();

JDBC 驱动程序失败并显示以下消息:

org.postgresql.util.PSQLException: ERROR: column "favorite_number" is of type integer but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.

有没有办法以不需要显式类型转换的方式创建此 INSERT 语句?

最佳答案

JDBC 对准备语句中使用的类型非常严格。

绕过该问题的一种方法是使用 PreparedStatement 变量的元数据来检索与每个动态参数关联的类型。
在您的情况下,如果其中之一是数字,您可以使用 Integer.ValueOf(dataValues.get(key))< 返回的整数执行 ps.setInt(...)/

您可以调用 ps.getParameterMetaData() 来检索 ParameterMetaData 实例。
然后,您可以从该实例调用 getParameterType(int param)getParameterTypeName(int param) 来检索参数类型。对两者进行测试,看看哪一个更合适。

不幸的是,它不确定它是否有效,因为根据 DBMS,这些元数据实用程序或多或少都得到了很好的实现......
即使有效,也是有代价的。

<小时/>

java.sql.ParameterMetaData

An object that can be used to get information about the types and properties for each parameter marker in a PreparedStatement object. For some queries and driver implementations, the data that would be returned by a ParameterMetaData object may not be available until the PreparedStatement has been executed.

Some driver implementations may not be able to provide information about the types and properties for each parameter marker in a CallableStatement object.

不要犹豫,提出反馈:)

关于java - 如何将数据持久保存到 postgres,而无需转换特定的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40248417/

相关文章:

spring - 使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

java - 我想将一个数字拆分为一位数字并将其更改为android中的二进制

java - 使用线程的多个客户端和多个服务器

java - 可以对 Windows 环境变量的修改进行单元测试吗?

java - Spring 2.0.0.RELEASE 中的 Mockito Bug

ruby - 从 rails 3 升级到 rails 4 时 has_many 关联的顺序错误

java - 停止接收套接字蓝牙数据

java - 解析 xml 找不到架构文件

sql - 在 postgres 中,是否可以优化 UNION 的 VIEW

database - CREATE DATABASE 不能在事务 block 内运行