Я недавно переключился на Hibernate 6. Теперь я сталкиваюсь с этим исключением, если регистрируется запрос, который содержит символ % для Подобная предложение < /code>. < /p>
вызван: java.lang.illegalargumentException: Проверка не удалось для запроса для метода Public Abstract java.lang.integer EU. rentall.application.repository.agpinternalorderrepository.resetinternalorderfromprocessing (java.lang.long) < /p>
at org.springframework.data.jpa.Repository.query.simplejpaquery.validate.validate.validate.validate.validate.validate.validate (simplejpaery.jpository.query.simplejpaquery.validate.
вызван: java.util.unknownformatconversionexception: confurtion = '' '
at java.base/java.util.formatter.parse (форматер .java: 2750)
at java.base /java.util.formatter.format (formatter.java:2671)
at java.base /java.util.formatter .format (formatter.java:2625)
at java.base /java.lang.string.format (string.java:4143)
at org.jboss.logging .Slf4JlocationAwareLogger.dologf (slf4jlocationAwareLogger.java:81)
at org.jboss.logging.logger.logf (logger.java:2445)
at org.jboss.logging . DelegatingBasiclogger.debugf (делегирование basiclogger.java:344)
at org.hibernate.query.hql.internal.standardhqltranslator.translate (Standardhqltranslator.java:75)
atrgernate.hibernate.hibernate.hibernate.hibernate.hibernate.hibernate. .AbStractSharedSessionContract.lambda $ interprethql $ 2 (AbstractShareSessionContract.java:744)
at org.hibernate.query.internal.queryinterpretationcachestandardimpl.createhqlinterprettation (queryinterptationcachestandardiMpl.java:141) < / / / / /preteh -prote Br /> I обновлен до Spring Boot 3.1.0, а теперь также модернизировал Hibernate до 6.2.5.final. < /p>
Я также использую org.slf4j: 2.0.7 с орг. jboss.logging: 3.5.0final в качестве ее реализации. < /p>
Фреймворк log as CH.qos.logback: 1.4.7. < /p>
Причина
для запросов org.hibernate.query.hql.internal.standardhqltranslator#translate вызывается.
Код: Выделить всё
@Override
public SqmStatement translate(String query, Class expectedResultType) {
HqlLogging.QUERY_LOGGER.debugf( "HQL : " + query );
...
}
Разница между этими двумя методами заключается в этой строке в org.jboss.logging.Slf4jLocationAwareLogger:
Код: Выделить всё
// doLog(..)
final String text = parameters == null || parameters.length == 0 ? String.valueOf(message) : MessageFormat.format(String.valueOf(message), parameters);
// doLogf(..)
final String text = parameters == null ? String.format(format) : String.format(format, parameters);
Поэтому String.format(format, параметры) вызывается, который считает % выражением формата.
Исправление (будет развернуто в Hibernate 6.2.6)
org.hibernate.query.hql.internal.StandardHqlTranslator#translate следует изменить на вызов:
Код: Выделить всё
HqlLogging.QUERY_LOGGER.debugf( "HQL : %s", query );
что привело к появлению отчета об ошибке: https://hibernate.atlassian.net/browse/HHH-16831
Вопрос
В качестве временного решения я хотел бы предоставить собственную реализацию org.hibernate.query.hql.HqlTranslator с указанным исправлением.
Интерфейс org.hibernate.query.spi.QueryEngineOptions даже определяет метод:
Код: Выделить всё
HqlTranslator getCustomHqlTranslator();. QueryEngineOptionsОднако мне еще предстоит найти способ предоставить эти параметры Hibernate, поэтому он будет использовать мою реализацию.
Как зарегистрировать собственную реализацию org.hibernate.query.hql.HqlTranslator?
Подробнее здесь: https://stackoverflow.com/questions/765 ... ing-boot-3
Мобильная версия