頭痛の種になるコードは次のとおりです。
public List<String> listColumnsForTable(String tableName) throws SQLException {
List<String> columns = new ArrayList<String>();
DatabaseMetaData metadata = _connection.getMetaData();
ResultSet resultSet = metadata.getColumns(null, null, tableName, null);
while (resultSet.next())
columns.add(resultSet.getString("COLUMN_NAME"));
return columns;
}
このコードは SQL Server で正常に動作します(MySQL、Oracle などでは確認していません) が、インメモリ データベースでいくつかの統合テストを実行する必要があります。私が試したすべてのデータベース (h2、hsqldb、および derby)は失敗しました。
ここに github のリンクがあります。
完全なプロジェクト(h2、hsqldb、derby、および sql サーバーのテストを含む) が必要な場合は、次の手順を実行します。
git clone git://github.com/sensui/InMemoryColumns.git
cd InMemoryColumns
gradlew
すべての依存関係が自動的にダウンロードされます。ライブラリのバージョンを確認したい場合は、build.gradle
スクリプトを参照してください。
お気に入りの IDE (eclipse または idea) にプロジェクトをインポートします。
テストは、DatabaseMetadataCheckerTests
クラス (canListColumnsForTable
およびcanCheckIfColumnsExistInTable
) で使用できます。
通常、これらは変更しないでください。インメモリデータベースごとに接続の詳細を提供する4つのテストクラスを作成しました。それらを実行する必要があります(これDatabaseMetadataCheckerTests
は抽象的であるため、実行しません)。
注:
特定のデータベースのテストに合格するよりも解決策が見つかった場合。クラスを拡張して接続の詳細を提供するだけで、Oracle や MySQL などの他のデータベースを簡単に試すことができますDatabaseMetadataCheckerTests
(他のテストを確認してください)。
問題が解決しました
テーブル名と列名はUPPERCASEにする必要があります。詳細については、このコミットを確認してください。