在我的应用程序中,我使用Hibernate和SQL Server数据库,所以我设置了
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect">
在我的persistence.xml中。
在某些情况下,我想对包含NULL的记录进行排序,我使用关键字NULLS FIRST
因为Hibernate中的CriteriaQuery / CriteriaBuilder默认不支持它,所以我使用Interceptor来修改本机查询。
问题是,SQL Server不支持关键字NULLS FIRST,因此我使用关键字:
case when column_name is null then 0 else 1 end, column_name
如果我想将数据库从SQL Server迁移到Oracle(例如),那么我需要在我的拦截器中放置if-else,选择我正在使用哪种方言,对吧?
这就是我说明它们的方式:
String dialect = ..............
if (dialect.equals("org.hibernate.dialect.SQLServerDialect")) { // get SQL Server dialect
// put keyword "case when column_name is null then 0 else 1 end, column_name"
} else {
// put keyword "NULLS FIRST/LAST"
}
如何在运行时获取方言配置(在persistence.xml中)?
答案 0 :(得分:4)
如果你使用Spring + hibernate,试试这个
@Autowired@Qualifier("sessionFactory") org.springframework.orm.hibernate3.LocalSessionFactoryBean sessionFactory; //Suppose using hibernate 3
并在您的方法中:
sessionFactory.getHibernateProperties().get("hibernate.dialect")
答案 1 :(得分:1)
我在这篇文章中找到了答案:Resolve SQL dialect using hibernate
感谢@Dewfy,
这是解决方案:
//take from current EntityManager current DB Session
Session session = (Session) em.getDelegate();
//Hibernate's SessionFactoryImpl has property 'getDialect', to
//access this I'm using property accessor:
Object dialect =
org.apache.commons.beanutils.PropertyUtils.getProperty(
session.getSessionFactory(), "dialect");
//now this object can be casted to readable string:
if (dialect.toString().equals("org.hibernate.dialect.SQLServerDialect")) {
} else {
}
答案 2 :(得分:0)
以下内容对于在WildFly 14中运行的Java EE应用程序中访问方言非常有用:
import org.hibernate.Session;
import org.hibernate.dialect.Dialect;
import org.hibernate.internal.SessionFactoryImpl;
...
@PersistenceContext
private EntityManager entityManager;
...
final Session session = (Session) entityManager.getDelegate();
final SessionFactoryImpl sessionFactory = (SessionFactoryImpl) session.getSessionFactory();
final Dialect dialect = sessionFactory.getJdbcServices().getDialect();
logger.info("Dialect: {}", dialect);
您需要将具有提供的范围的hibernate-core
依赖项添加到pom.xml
。