Функция пользовательского диалекта с различным количеством параметров не работает в Hibernate 6JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Функция пользовательского диалекта с различным количеством параметров не работает в Hibernate 6

Сообщение Anonymous »

Продукт, который я обновляю с Hibernate 5 до Hibernate 6, ранее использовал диалекты hibernate для приема вызова Convert_tz(...) и его соответствующей трансляции для различных баз данных (MariaDB, PostgreSQL и т. д.). p>
Пример звонка:

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

convert_tz(entity.timestamp, '+00:00', '-04:00', -240, 'UTC', 'America/Anguilla'
Первоначальный HQL-запрос, который находится внутри, генерируется каким-то непроницаемым кодом, который я бы хотел избежать изменения любой ценой.
Данный пользовательский диалект может затем возьмите его и преобразуйте во что-то удобное для текущей БД. См. несколько примеров ниже, чтобы понять, насколько гибким нам это нужно. Все потенциально необходимые данные сохраняются при первоначальном вызове и соответствующим образом реорганизуются.
MariaDB: Convert_tz(entity.timestamp, '+00:00', '-04:00' )
PostgreSQL:entity.timestamp В часовом поясе «UTC» В часовом поясе «Америка/Ангилья»
Способ определения этой функции на диалекте в Hibernate 5 больше не поддерживается, он не компилируется. (похоже, что ни одна из функций больше не существует)
Вот как мы успешно работали в Hibernate 5, который больше не компилируется с Hibernate 6:
< pre class="lang-java Prettyprint-override">

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

public class CustomMariaDBDialect5 extends MariaDBDialect{
public CustomMariaDBDialect5 () {
registerColumnType( Types.TIMESTAMP, "datetime" );
super.registerFunction("convert_tz", new SQLFunctionTemplate(DateType.INSTANCE, "convert_tz(?1, ?2, ?3) "));
}
А вот моя наивная попытка обновить его до Hibernate 6

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

public class CustomMariaDBDialect6 extends MariaDBDialect {
public CustomMariaDBDialect6() {
super();
}

@Override
public void contributeFunctions(FunctionContributions functionContributions) {
super.contributeFunctions(functionContributions);
functionContributions.getFunctionRegistry().registerPattern("convert_tz",
"convert_tz(?1, ?2, ?3) ", functionContributions.getTypeConfiguration().getBasicTypeRegistry().resolve(StandardBasicTypes.DATE));
}

@Override
protected String columnType(int sqlTypeCode) {
if(sqlTypeCode == Types.TIMESTAMP){
return "datetime";
}else{
return super.columnType(sqlTypeCode);
}
}
}
С помощью отладки я вижу, что вызывается метод submitFunctions, и когда я запускаю свою программу, я получаю следующую ошибку:

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

org.hibernate.query.sqm.produce.function.FunctionArgumentException: Function convert_tz() has 3 parameters, but 6 arguments given
Похоже, что новый способ регистрации функций в hibernate 6 более строгий в отношении подсчета параметров. Возможно ли, что наш подход здесь просто больше не поддерживается?


Подробнее здесь: https://stackoverflow.com/questions/785 ... ibernate-6
Ответить

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

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

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

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

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