在我的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语句,不需要显式类型转换?
答案 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对象。
不要犹豫做反馈:)