如何在运行时获取休眠方言

2022-09-04 03:42:30


在我的应用程序中,我将Hibernate与SQL Server数据库一起使用,因此我设置

<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect">

在我的坚持中.xml。

在某些情况下,我想用NULL包含对记录进行排序,我首先使用关键字NULLS。
由于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放在我的Interceptor中,选择我使用的方言,对吧?

这就是我如何说明它们:

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"
}

如何在运行时获取方言配置(持久性.xml)?


答案 1

以下内容非常适合我在 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-corepom.xml


答案 2

如果您使用Spring+Hibernate,请尝试以下操作

@Autowired@Qualifier("sessionFactory") org.springframework.orm.hibernate3.LocalSessionFactoryBean sessionFactory; //Suppose using hibernate 3

并在您的方法中:

sessionFactory.getHibernateProperties().get("hibernate.dialect")

推荐