是否有一种确定从用户类型中使用的数据库的方法?我的用户类型需要根据数据库(无论是HSQL还是Oracle)向preparedStatement.setObject传递不同的对象。我计划使用来自preparedStatement的preparedStatement作为
preparedStatement.getConnection().getMetaData().getDatabaseProductName()但我不确定是否有一组定义良好的字符串可以与上面的字符串进行比较以确定数据库。
我想要解决的更大的问题是,我们在Oracle中使用日期列,而hibernate将JodaDateTime映射到时间戳(这是唯一能够保存日期和时间的类型)。因此,Oracle在执行日期比较之前将DB中的日期值提升为时间戳。这会导致性能低下,因为数据库索引被跳过。将列类型从日期更改为时间戳的选项被排除在外,因为它需要更多的空间,而且我们的应用程序不需要超过秒的精度。因此,我计划编写一个userType,将DateTime转换为oracle.sql.DATE,并在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中设置不同对象的地方。
所以,我想知道
谢谢。
发布于 2012-10-14 07:46:57
使用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
}我不太确定你的目标,但上面应该对你有帮助。
https://stackoverflow.com/questions/12879649
复制相似问题