如何将数据持久化到postgres而不必转换特定的数据类型

时间:2016-10-25 19:44:08

标签: 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语句,不需要显式类型转换?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

<强> java.sql.ParameterMetaData

  

可用于获取有关类型和信息的信息的对象   PreparedStatement对象中每个参数标记的属性。   对于某些查询和驱动程序实现,数据将是   由ParameterMetaData返回的对象可能无法使用   PreparedStatement已被执行。

     

某些驱动程序实现可能无法提供信息   关于a中每个参数标记的类型和属性   CallableStatement对象。

不要犹豫做反馈:)