java 如何在运行时获取Hibernate方言

s5a0g9ez  于 2023-01-29  发布在  Java
关注(0)|答案(4)|浏览(349)

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

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

保存在我的persistence.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,选择我使用的方言,对吗?
下面是我对它们的说明:

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中)?

kulphzqa

kulphzqa1#

对于在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);

您需要将具有 provided 作用域的hibernate-core依赖项添加到pom.xml

2nbm6dog

2nbm6dog2#

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

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

在你的方法中

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

bzzcjhmw3#

我已经从这个帖子中找到了答案: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 {

}
66bbxpm5

66bbxpm54#

其他的答案对我来说都不管用。这个管用:

import java.util.Properties;
import org.hibernate.cfg.Configuration;

Properties properties = new Configuration().configure().getProperties();
String dialect = properties.getProperty("hibernate.dialect");

相关问题