有没有办法确定性地确定从用户类型中使用的数据库?我的用户类型需要将不同的对象传递给preparedStatement.setObject,具体取决于数据库(无论是HSQL还是Oracle)。我打算使用preparedStatement中的DataBaseMetaData作为
preparedStatement.getConnection().getMetaData().getDatabaseProductName()
但我不确定是否有一组定义明确的字符串,我可以将上述字符串与确定数据库进行比较。
我正在尝试解决的更大问题是,我们在Oracle中使用DATE列,而hibernate将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知道数据库并在preparedStatement中设置不同对象的地方。
所以,我想知道
感谢。
答案 0 :(得分:3)
使用Dialect.getDialect()检索您当前的方言。检查实例类型以了解下面的数据库.e.g:
Dialect dialect= Dialect.getDialect();
//<-- compare against the expected dailect classes
if(dialect instanceof OracleDialect){
//your database is oracle
}else if(dialect instanceof HSQLDialect){
//<-- compare against the expected dailect classes
//your database is HSQL
}
我对你的目标不太确定,但上面应该对你有帮助。