Невозможно найти пользовательскую функцию SQL to_timestamp после обновления Spring Boot 3.2.0JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Невозможно найти пользовательскую функцию SQL to_timestamp после обновления Spring Boot 3.2.0

Сообщение Anonymous »

Недавно я обновил свое приложение Spring Boot с Spring Boot 2.3.8 с Java 11 до Spring Boot 3.2.0 и Ява 17. В моем приложении я использую базу данных PostgreSQL, и в моих запросах JPA есть специальная функция SQL to_timestamp для извлечения записей на основе динамического диапазона времени. Раньше запрос работал отлично в моей предыдущей настройке, но после обновления он больше не работает должным образом. Выдает ошибку, например, функция to_timestamp не найдена.
Мой запрос
Вот запрос JPA, который я использую:

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

select c from Customer c where to_timestamp(c.created_date) BETWEEN to_timestamp(cast(:fromtime as text)) AND to_timestamp(cast(:toTime as text))
Пользовательский класс функции SQL
Чтобы настроить функцию to_timestamp, я использую собственный MetadataBuilderContributor
Пользовательский класс функции SQL
Чтобы настроить функцию to_timestamp, я использую пользовательский MetadataBuilderContributor класс. Вот код, который я использовал в Spring Boot 2.3.8:

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

import org.hibernate.boot.MetadataBuilder;
import org.hibernate.boot.spi.MetadataBuilderContributor;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StandardBasicTypes;
import org.springframework.stereotype.Component;

@Component
public class SqlFunctionsMetadataBuilderContributor implements MetadataBuilderContributor {

@Override
public void contribute(MetadataBuilder metadataBuilder) {
metadataBuilder.applySqlFunction(
"to_timestamp",
new SQLFunctionTemplate(
StandardBasicTypes.TIMESTAMP,
"to_timestamp(to_char(?1 :: timestamptz AT TIME ZONE 'UTC' ,'HH24:MI'),'HH24:MI')::time"
)
);
}
}
Кроме того, я настроил участника в моем application.properties следующим образом:

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

spring.jpa.properties.hibernate.metadata_builder_contributor=com.example.SqlFunctionsMetadataBuilderContributor
Попытки решения
После обновления я пробовал разные подходы, в том числе:
1.Использование NamedSqmFunctionDescriptor для большего контроля над функцией в Spring Boot 3.2.0.

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

@Component
public class SqlFunctionsMetadataBuilderContributor implements MetadataBuilderContributor {

@Override
public void contribute(MetadataBuilder metadataBuilder) {
metadataBuilder.applySqlFunction("to_timestamp", ToTimestampFunction.INSTANCE);
}

public static class ToTimestampFunction extends NamedSqmFunctionDescriptor {
public static final ToTimestampFunction INSTANCE = new ToTimestampFunction();

public ToTimestampFunction() {
super("to_timestamp", false, StandardArgumentsValidators.exactly(1), null);
}

public void render(SqlAppender sqlAppender, List walker) {
Expression time = (Expression) arguments.get(0);
sqlAppender.appendSql("to_timestamp(");
walker.render(time, SqlAstNodeRenderingMode.DEFAULT);
sqlAppender.appendSql(" ::text,'HH24:MI')::time");
}
}
}
2.Использование дескрипторов функций SQL на основе других руководств по миграции в Hibernate.
Несмотря на эти усилия, функция по-прежнему не распознается правильно в обновленном приложении.
Вопрос
Кто-нибудь успешно реализовал подобную функцию to_timestamp в Spring Boot 3.2 .0 с Java 17? Будем очень признательны за любые советы по адаптации этой функции или MetadataBuilderContributor для совместимости с последними версиями Spring Boot/Hibernate!
Также попробовал это решение

https://chatgpt.com/share/6721ed48-3ae8 ... 5306a2b3a3

Подробнее здесь: https://stackoverflow.com/questions/791 ... -0-upgrade
Ответить

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

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

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

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

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