Начиная с Hibernate 5, если вы не хотите зависеть от диалекта или настраивать его, вы можете определить MetadataBuilderInitializer
. Например, чтобы использовать MySQL DATE_ADD
с INTERVAL
из HQL, вы можете определить пользовательскую функцию с именем date_add_interval
:
public class DateAddIntervalMetadataBuilderInitializer
implements MetadataBuilderInitializer {
@Override
public void contribute(MetadataBuilder metadataBuilder,
StandardServiceRegistry serviceRegistry) {
metadataBuilder.applySqlFunction("date_add_interval",
new SQLFunctionTemplate(DateType.INSTANCE,
"DATE_ADD(?1, INTERVAL ?2 ?3)"));
}
}
Вам также необходимо поместить имя класса в файл ресурсов JAR с именем META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer
.
Этот подход особенно полезен при использовании Hibernate с помощью такой инфраструктуры, как JPA и / или Spring, где конфигурация выполняется неявно с помощью инфраструктуры.