有没有办法从用户类型确定性地确定正在使用的数据库?我的用户类型需要根据数据库(无论是 HSQL 还是 Oracle)将不同的对象传递给preparedStatement.setObject。我打算使用preparedStatement中的DataBaseMetaData作为
preparedStatement.getConnection().getMetaData().getDatabaseProductName()
但我不确定是否有一组明确定义的字符串,我可以将其与上述字符串进行比较以确定数据库。
我要解决的更大问题是,我们在 Oracle 中使用 DATE 列,而 hibernate 将 JodaDateTime 映射到 TIMESTAMP(这是唯一可以保存日期和时间的类型)。因此,Oracle 在执行日期比较之前将数据库中的 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 不匹配问题
- 如果不是,如何从用户类型中正确识别数据库。
谢谢。