【问题标题】:How to ignore database tablename case-sensitivity using Spring's JdbcTemplate?如何使用 Spring 的 JdbcTemplate 忽略数据库表名区分大小写?
【发布时间】:2012-05-02 04:35:49
【问题描述】:

我们的 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 执行不区分大小写的查询?

【问题讨论】:

    标签: java spring case-sensitive jdbctemplate


    【解决方案1】:

    如果您支持大量数据库,您可能会发现更多问题,而不仅仅是区分大小写的名称。这是一个很好的机会来强调使用接口抽象数据访问以及为每个受支持的数据库供应商编写实现的重要性。

    在您的应用程序中,您应该对界面进行编码。当您使用 spring 时,您可以使用依赖注入在数据访问层中使用适当的 DB 实现;它只是对应用程序上下文配置文件的一个小改动。

    【讨论】:

    • 同意,这可能是最好的解决方案。
    【解决方案2】:

    我认为您的问题是 user 是 MS-SQL 服务器上的 reserverd keyword

    也可以看看这里:Is SQL syntax case sensitive?

    【讨论】:

    • 其实用户只是一个例子。我会改变我的问题。
    • 虽然我不确定这是遇到的实际问题,但它肯定是可疑的,应该避免一些事情。实际上,我相当确定userall RDBMS 上的保留字。如果 OP 可以为我们提供不同的示例,这应该很容易验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多