【发布时间】:2015-11-15 01:10:58
【问题描述】:
我一直在阅读有关此问题的一些帖子,但找不到适合我的环境的解决方案。
我正在使用 Oracle 驱动程序 11.2.0.3.0 和 Spring JDBC 4.1.4.RELEASE。
从site 我了解到 Oracle 默认使用带有字符串参数的 VARCHAR 语义,这会产生我正在处理的错误(如果我将 'a' 与 'a' 进行比较,则它不匹配)。
理论上使用连接参数“fixedString=true”应该可以解决问题。但是在我的datasource configuration 中使用它并没有任何改变。
<bean id="dataSourcePool" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
<property name="connectionProperties" value="fixedString=true;" />
</bean>
为了以防万一,我尝试使用 OracleDataSource 而不是 commons,但它不起作用。
有人知道我在这里做错了什么吗?
谢谢。
编辑:我找到了一个解决方法,它不是我想要的,但它可以在没有参数“fixedString”的情况下工作。
在我像这样在 Spring JDBC 中设置我的 SQL 参数之前(这是一个示例):
Map<String, Object> parameters = new HashMap<>();
parameters.put("newCharParemeter", "hello");
namedParameterJdbcTemplate.query(sql, parameters, new MyMapper());
调试NamedParameterJdbcTemplate类,发现Spring调用了PreparedStatement.setString方法,因为它不知道“newCharParameter”是什么类型的参数。
如果我将之前的代码修改为:
Map<String, Object> parameters = new HashMap<>();
parameters.put("newCharParemeter", new SqlParameterValue(OracleTypes.FIXED_CHAR, "hello"));
namedParameterJdbcTemplate.query(sql, parameters, new MyMapper());
然后,由于 FIXED_CHAR 类型,Spring 调用 PreparedStatement.setObject 删除尾随空格,因此一切正常。
【问题讨论】:
-
看看this post 是否有帮助。我有一个sample app,其中包含本文中提到的必要代码。
-
我检查了你的帖子,但他们使用 Hibernate,我们使用 Spring JDBC。
标签: spring oracle jdbc datasource