2

Java (JDK6) アプリケーションは、Oracle、SQL Server、DB2 などのさまざまなデータベースをサポートする必要があります。データベースへのアクセスには Spring 3.0 と JDBCTemplate を使用します。クライアントの 1 つは、大文字と小文字を区別し、テーブル名を自動的に大文字にする 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 を使用して大文字と小文字を区別しないクエリを実行する方法はありますか?

4

2 に答える 2

2

多数のデータベースをサポートしている場合、名前の大文字と小文字を区別するだけでなく、さらに多くの問題が見つかる可能性があります。これは、インターフェイスを使用してデータ アクセスを抽象化し、サポートされている各データベース ベンダーの実装を作成することの重要性を強調する絶好の機会です。

アプリでは、インターフェイスにコーディングする必要があります。Spring を使用しているため、依存性注入を使用して、データ アクセス レイヤーで適切な DB 実装を使用できます。アプリケーション コンテキスト構成ファイルへのほんの些細な変更です。

于 2012-04-20T15:35:14.907 に答える
0

userここでの問題は、MS-SQL サーバーの予約キーワードであると思います。

こちらもご覧ください: Is SQL syntax casesensitive?

于 2012-04-20T15:21:50.400 に答える