Мой запрос
Вот запрос 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))
Чтобы настроить функцию 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"
)
);
}
}
Код: Выделить всё
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");
}
}
}
Несмотря на эти усилия, функция по-прежнему не распознается правильно в обновленном приложении.
Вопрос
Кто-нибудь успешно реализовал подобную функцию 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
Мобильная версия