Как получить Hibernate диалект во время выполнения
В моем приложении я использую Hibernate с базой данных SQL Server, поэтому я установил
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect">
в моем постоянстве.xml.
В некоторых случаях я хочу сортировать записи с помощью NULL, я использую ключевое слово NULLS FIRST.
Поскольку он не поддерживается по умолчанию CriteriaQuery/CriteriaBuilder в Hibernate, я использую Interceptor для изменения собственного запроса.
Проблема в том, что ключевое слово NULLS FIRST не поддерживается в SQL Server, поэтому я использую ключевое слово:
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) во время выполнения?
4 ответа
Для доступа к диалекту в приложении Java EE, работающем в WildFly 14, мне подходит следующее:
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
.
Если вы используете Spring+ Hibernate, попробуйте это
@Autowired@Qualifier("sessionFactory") org.springframework.orm.hibernate3.LocalSessionFactoryBean sessionFactory; //Suppose using hibernate 3
и в вашем методе:
sessionFactory.getHibernateProperties().get("hibernate.dialect")
Я нашел ответ из этого поста: Разрешить SQL-диалект с помощью гибернации
Спасибо за @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 {
}
Другие ответы не сработали в моем случае. Это сработало:
import java.util.Properties;
import org.hibernate.cfg.Configuration;
Properties properties = new Configuration().configure().getProperties();
String dialect = properties.getProperty("hibernate.dialect");