2012-04-20 947 views
2

我們的Java(JDK6)應用程序必須支持不同的數據庫,例如Oracle,SQL Server和DB2。我們使用Spring 3.0和JDBCTemplate進行數據庫訪問。我們的客戶之一使用SQL Server 2005,區分大小寫並自動設置大寫的表名。如何使用Spring的JdbcTemplate忽略數據庫表名區分大小寫?

顯然,諸如「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執行不區分大小寫的查詢?

回答

2

如果要支持大量的數據庫,你可能會發現更多的問題不僅僅是區分大小寫的名字。這是一個很好的機會,強調用接口抽象數據訪問的重要性,併爲每個支持的數據庫供應商編寫實現。

在您的應用程序中,您應該編碼到界面。在使用spring時,可以使用依賴注入在數據訪問層中使用適當的數據庫實現;它對應用程序上下文配置文件只是一個微不足道的變化。

+0

同意,這可能是最好的解決方案。 – Tarek 2012-04-20 16:44:20

0

我認爲你的問題在於,在MS-SQL服務器上userreserverd keyword

也看看這裏:Is SQL syntax case sensitive?

+0

其實用戶只是一個例子。我會改變我的問題。 – Tarek 2012-04-20 15:25:51

+0

雖然我不確定這是否是實際遇到的問題,但它肯定是可疑的,並且有一些需要避免的地方。其實,我很確定'user'是_all_ RDBMS上的一個保留字。如果OP可以爲我們提供一個不同的例子,這應該很容易驗證。 – 2012-04-20 15:28:59

相關問題