我们的Java(JDK6)应用程序必须支持不同的数据库,例如Oracle,SQL Server和DB2。我们使用Spring 3.0和JDBCTemplate进行数据库访问。我们的一个客户端使用具有区分大小写的SQL Server 2005和自动大写表名称。
显然,诸如“select * from mytablename m”之类的查询对于所述客户端不起作用,因为他将拥有表MYTABLENAME。
例如,对于以下代码,我得到一个很好的例外:
this.jdbcTemplate.queryForOject("select * from mytablename m");
`Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select * from mytablename m]; nested exception is java.sql.SQLException: Invalid object name 'mytablename'.`
我不得不调整代码 - 因为我无法更改客户端的数据库选项 - 所以最明显的解决方案是大写查询中的所有表名。我知道这对这个客户端有用,但是如果一个新客户端有一个具有区分大小写和小写表名的数据库怎么办?
到目前为止,我还没有成功找到更广泛的解决方案。我发现的大多数答案都需要更改数据库的区分大小写或重写查询。我尝试过使用this.jdbcTemplate.setResultsMapCaseInsensitive(true);
,但如果我理解得很好,它只适用于我的查询结果,而不适用于查询本身。
有没有办法使用Spring的JdbcTemplate执行不区分大小写的查询?
答案 0 :(得分:2)
如果您支持大量数据库,您可能会发现更多问题,而不仅仅是区分大小写的名称。这是一个强调通过接口抽象数据访问的重要性,以及为每个受支持的数据库供应商编写实现的重要机会。
在您的应用中,您应该对界面进行编码。在使用spring时,可以使用依赖注入在数据访问层中使用适当的DB实现;它只是对应用程序上下文配置文件的一个微不足道的更改。
答案 1 :(得分:0)
我认为您的问题是user
是MS-SQL服务器上的reserverd keyword。