From dcf45d1bf42cf19e709ddaff1d30cd2a8044668d Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 27 Nov 2025 09:49:28 +0100 Subject: [PATCH] Polishing. Add support for limit/offset and implement introspection methods to avoid throwing UnsupportedOperationException. See #4103 --- .../data/jpa/repository/aot/AotMetamodel.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/AotMetamodel.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/AotMetamodel.java index 14e4a8075..751bf19d3 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/AotMetamodel.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/AotMetamodel.java @@ -17,6 +17,7 @@ package org.springframework.data.jpa.repository.aot; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.TemporalType; import jakarta.persistence.metamodel.EmbeddableType; import jakarta.persistence.metamodel.EntityType; import jakarta.persistence.metamodel.ManagedType; @@ -33,12 +34,15 @@ import org.hibernate.cfg.JdbcSettings; import org.hibernate.cfg.PersistenceSettings; import org.hibernate.cfg.QuerySettings; import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.pagination.LimitHandler; +import org.hibernate.dialect.pagination.OffsetFetchLimitHandler; import org.hibernate.dialect.sequence.ANSISequenceSupport; import org.hibernate.dialect.sequence.SequenceSupport; import org.hibernate.engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl; import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor; +import org.hibernate.query.common.TemporalUnit; import org.jspecify.annotations.Nullable; import org.springframework.data.util.Lazy; import org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes; @@ -142,11 +146,33 @@ class AotMetamodel implements Metamodel { static SpringDataJpaAotDialect INSTANCE = new SpringDataJpaAotDialect(); + public boolean isCurrentTimestampSelectStringCallable() { + return false; + } + + public String getCurrentTimestampSelectString() { + return "call current_timestamp()"; + } + + @Override + public LimitHandler getLimitHandler() { + return OffsetFetchLimitHandler.INSTANCE; + } + @Override public SequenceSupport getSequenceSupport() { return ANSISequenceSupport.INSTANCE; } + @Override + @SuppressWarnings("deprecation") + public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) { + if (unit == null) { + return "(?3-?2)"; + } + return "datediff(?1,?2,?3)"; + } + } }