diff --git a/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/JpaMapKeycloakTransaction.java b/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/JpaMapKeycloakTransaction.java index bd6811c3243..444a4e26277 100644 --- a/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/JpaMapKeycloakTransaction.java +++ b/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/JpaMapKeycloakTransaction.java @@ -31,8 +31,9 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; import org.jboss.logging.Logger; -import static org.keycloak.models.map.storage.jpa.PaginationUtils.paginateQuery; +import org.keycloak.common.util.Time; import org.keycloak.models.map.common.AbstractEntity; +import org.keycloak.models.map.common.ExpirableEntity; import org.keycloak.models.map.common.StringKeyConverter; import org.keycloak.models.map.common.StringKeyConverter.UUIDKey; import org.keycloak.models.map.storage.MapKeycloakTransaction; @@ -40,7 +41,9 @@ import org.keycloak.models.map.storage.QueryParameters; import org.keycloak.models.map.storage.chm.MapFieldPredicates; import org.keycloak.models.map.storage.chm.MapModelCriteriaBuilder; +import static org.keycloak.models.map.common.ExpirationUtils.isExpired; import static org.keycloak.models.map.storage.jpa.JpaMapStorageProviderFactory.CLONER; +import static org.keycloak.models.map.storage.jpa.PaginationUtils.paginateQuery; import static org.keycloak.utils.StreamsUtil.closing; public abstract class JpaMapKeycloakTransaction implements MapKeycloakTransaction { @@ -48,6 +51,7 @@ public abstract class JpaMapKeycloakTransaction entityType; private final Class modelType; + private final boolean isExpirableEntity; protected EntityManager em; @SuppressWarnings("unchecked") @@ -55,6 +59,7 @@ public abstract class JpaMapKeycloakTransaction selectCbConstruct(CriteriaBuilder cb, Root root); @@ -98,7 +103,8 @@ public abstract class JpaMapKeycloakTransaction, Predicate> predicateFunc = mcb.getPredicateFunc(); + if (this.isExpirableEntity) { + predicateFunc = predicateFunc != null ? predicateFunc.andThen(predicate -> cb.and(predicate, notExpired(cb, root))) + : this::notExpired; + } if (predicateFunc != null) query.where(predicateFunc.apply(cb, root)); return closing(paginateQuery(em.createQuery(query), queryParameters.getOffset(), queryParameters.getLimit()).getResultStream()) @@ -233,4 +243,9 @@ public abstract class JpaMapKeycloakTransaction root) { + return cb.or(cb.greaterThan(root.get("expiration"), Time.currentTimeMillis()), + cb.isNull(root.get("expiration"))); + } }