Как я могу зарегистрировать пользовательский HQLTranslator в Hibernate 6 (Spring Boot 3)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как я могу зарегистрировать пользовательский HQLTranslator в Hibernate 6 (Spring Boot 3)

Сообщение Anonymous »

проблема
Я недавно переключился на 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 );
...
}
После отладки всего этого кода я обнаружил, что проблема заключается в использовании HqlLogging.QUERY_LOGGER.debugf вместо HqlLogging.QUERY_LOGGER.debug.
Разница между этими двумя методами заключается в этой строке в 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);
Поскольку StandardHqlTranslator не предоставляет параметры, для параметров устанавливается пустой массив.
Поэтому String.format(format, параметры) вызывается, который считает % выражением формата.
Исправление (будет развернуто в Hibernate 6.2.6)
org.hibernate.query.hql.internal.StandardHqlTranslator#translate следует изменить на вызов:

Код: Выделить всё

HqlLogging.QUERY_LOGGER.debugf( "HQL : %s", query );
Я уже сообщил о проблеме в Hibernate: https://discourse.hibernate.org/t/query ... e-6-causes -an-Exception-when-a-query-contains-a-like-qerry/7861
что привело к появлению отчета об ошибке: https://hibernate.atlassian.net/browse/HHH-16831

Вопрос
В качестве временного решения я хотел бы предоставить собственную реализацию org.hibernate.query.hql.HqlTranslator с указанным исправлением.
Интерфейс org.hibernate.query.spi.QueryEngineOptions даже определяет метод:

Код: Выделить всё

HqlTranslator getCustomHqlTranslator();. QueryEngineOptions
расширяется с помощью SessionFactoryOptions.
Однако мне еще предстоит найти способ предоставить эти параметры Hibernate, поэтому он будет использовать мою реализацию.
Как зарегистрировать собственную реализацию org.hibernate.query.hql.HqlTranslator?

Подробнее здесь: https://stackoverflow.com/questions/765 ... ing-boot-3
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»