postgres将字符串插入数字列 - 不会发生自动类型转换

时间:2016-04-27 08:09:26

标签: database postgresql casting jdbctemplate

postgres DB test1中有一个表格,其中包含架构:enter image description here

我们使用spring框架jdbcTemplate来插入数据如下:

Object[] params = {"978","tour"};

jdbcTemplate.update("insert into test1 values (?,?)", params);

但是这给了例外:

  

org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法[插入test1值(?,?)];嵌套异常是org.postgresql.util.PSQLException:错误:列" id"是整数类型,但表达式的类型为字符变化   错误:列" id"是整数类型,但表达式是字符变化

这适用于Oracle数据库通过隐式类型转换,但postgres似乎不会那样工作。

这可能是postgres驱动程序的问题吗?

解决方法是明确投射:

insert into test1 values (?::numeric ,?)

但是有更好的方法来进行转换,因为这似乎不是一个好的解决方案,因为有很多查询需要修改,而且还可能存在其他类似的转换问题。

是否有一些参数可以在DB级别设置以执行自动转换?

2 个答案:

答案 0 :(得分:6)

我们在这里找到了答案

Storing json, jsonb, hstore, xml, enum, ipaddr, etc fails with "column "x" is of type json but expression is of type character varying"

应添加新的连接属性:

String url =" jdbc:postgresql:// localhost / test&#34 ;;

属性props = new Properties();

props.setProperty("用户"" fred的&#34);

props.setProperty("密码""秘密&#34);

props.setProperty(" stringtype","未指定");

Connection conn = DriverManager.getConnection(url,props);

https://jdbc.postgresql.org/documentation/94/connect.html

" 如果stringtype设置为unspecified,则参数将作为无类型值发送到服务器,服务器将尝试推断合适的类型。如果您有一个现有的应用程序使用setString()来设置实际上是其他类型的参数(如整数),并且您无法更改应用程序以使用适当的方法(如setInt()> "

答案 1 :(得分:1)

是的,请在这里删除双引号:

Object[] params = {"978","tour"};

变为

Object[] params = {978,"tour"};

或者像你提到的那样进行施法。