ユーザータイプから使用されているデータベースを決定論的に判断する方法はありますか? ユーザー タイプは、データベース (HSQL か Oracle か) に応じて、異なるオブジェクトを prepareStatement.setObject に渡す必要があります。私は準備されたステートメントからDataBaseMetaDataを使用することを計画していました
preparedStatement.getConnection().getMetaData().getDatabaseProductName()
しかし、上記を比較してデータベースを特定できる、明確に定義された一連の文字列があるかどうかはわかりません。
私が解決しようとしているより大きな問題は、Oracle で DATE 列を使用しているのに対し、休止状態では JodaDateTime を TIMESTAMP (日付と時刻を保持できる唯一の型) にマップすることです。そのため、Oracle は、日付比較を実行する前に、DB の DATE 値をタイムスタンプに昇格させます。これにより、データベース インデックスがスキップされるため、パフォーマンスが低下します。列タイプを DATE から TIMESTAMP に変更するオプションは、より多くのスペースが必要であり、アプリケーションが秒を超える精度を必要としないため、除外されます。したがって、インデックスの不一致がないように、DateTime を oracle.sql.DATE に変換する userType を記述し、preparedStatement にパラメーターを設定する予定です。(スニペットを以下に示します):
public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException {
if (value == null) {
Hibernate.TIMESTAMP.nullSafeSet(preparedStatement, null, index);
} else {
preparedStatement.setObject(index, new oracle.sql.DATE(new Timestamp(((DateTime) value).getMillis())), Types.DATE);
}
}
上記のアプローチの問題点は、単体テスト用に別のデータベース (HSQLDB) を使用すると、HSQLDialect が「oracle.sql.DATE」を認識しないため、機能しないことです。ここで、userType から DB を認識し、preparedStatement にさまざまなオブジェクトを設定する必要があります。
だから、私は知りたいです
- DATE-TIMESTAMP の不一致の問題を解決するためのより良い方法がある場合
- そうでない場合、ユーザータイプからDBを正しく識別する方法。
ありがとう。