diff --git a/pom.xml b/pom.xml index f188f46..7daef2a 100755 --- a/pom.xml +++ b/pom.xml @@ -117,7 +117,7 @@ spring-libs-snapshot - https://repo.spring.io/libs-snapshot + https://repo.spring.io/snapshot diff --git a/src/main/java/org/springframework/data/envers/repository/support/EnversRevisionRepositoryImpl.java b/src/main/java/org/springframework/data/envers/repository/support/EnversRevisionRepositoryImpl.java index de6ab24..fb7a155 100755 --- a/src/main/java/org/springframework/data/envers/repository/support/EnversRevisionRepositoryImpl.java +++ b/src/main/java/org/springframework/data/envers/repository/support/EnversRevisionRepositoryImpl.java @@ -15,14 +15,6 @@ */ package org.springframework.data.envers.repository.support; -import static org.springframework.data.history.RevisionMetadata.RevisionType.*; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -import javax.persistence.EntityManager; - import org.hibernate.Hibernate; import org.hibernate.envers.AuditReader; import org.hibernate.envers.AuditReaderFactory; @@ -32,6 +24,7 @@ import org.hibernate.envers.RevisionTimestamp; import org.hibernate.envers.RevisionType; import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditQuery; +import org.hibernate.envers.query.criteria.AuditProperty; import org.hibernate.envers.query.order.AuditOrder; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -49,6 +42,14 @@ import org.springframework.data.repository.history.support.RevisionEntityInforma import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import javax.persistence.EntityManager; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import static org.springframework.data.history.RevisionMetadata.RevisionType.*; + /** * Repository implementation using Hibernate Envers to implement revision specific query methods. * @@ -72,12 +73,12 @@ public class EnversRevisionRepositoryImpl entityInformation, - RevisionEntityInformation revisionEntityInformation, EntityManager entityManager) { + RevisionEntityInformation revisionEntityInformation, EntityManager entityManager) { Assert.notNull(revisionEntityInformation, "RevisionEntityInformation must not be null!"); @@ -145,29 +146,47 @@ public class EnversRevisionRepositoryImpl order.getDirection().isAscending() ? - AuditEntity.property(order.getProperty()).asc() : - AuditEntity.property(order.getProperty()).desc()) - .orElse(AuditEntity.revisionNumber().asc()); + private List mapPropertySort(Sort sort) { + + if (sort.isEmpty()) { + return Collections.singletonList(AuditEntity.revisionNumber().asc()); + } + + List result = new ArrayList<>(); + for (Sort.Order order : sort) { + + AuditProperty property = AuditEntity.property(order.getProperty()); + AuditOrder auditOrder = order.getDirection().isAscending() ? + property.asc() : + property.desc(); + + result.add(auditOrder); + } + + return result; } @SuppressWarnings("unchecked") public Page> findRevisions(ID id, Pageable pageable) { - AuditOrder orderMapped = (pageable.getSort() instanceof RevisionSort) ? - mapRevisionSort((RevisionSort) pageable.getSort()) : - mapPropertySort(pageable.getSort()); - List resultList = createBaseQuery(id) // - .addOrder(orderMapped) // - .setFirstResult((int) pageable.getOffset()) // - .setMaxResults(pageable.getPageSize()) // - .getResultList(); + AuditQuery baseQuery = createBaseQuery(id); + + List orderMapped = (pageable.getSort() instanceof RevisionSort) ? + Collections.singletonList(mapRevisionSort((RevisionSort) pageable.getSort())) : + mapPropertySort(pageable.getSort()); + + orderMapped.forEach(baseQuery::addOrder); + + List resultList = baseQuery // + .setFirstResult((int) pageable.getOffset()) // + .setMaxResults(pageable.getPageSize()) // + .getResultList(); Long count = (Long) createBaseQuery(id) // .addProjection(AuditEntity.revisionNumber().count()).getSingleResult(); @@ -224,7 +243,7 @@ public class EnversRevisionRepositoryImpl(Hibernate.unproxy(metadata), RevisionNumber.class, RevisionTimestamp.class, - revisionType); + revisionType); } private static RevisionMetadata.RevisionType convertRevisionType(RevisionType datum) { diff --git a/src/test/java/org/springframework/data/envers/repository/support/RepositoryIntegrationTests.java b/src/test/java/org/springframework/data/envers/repository/support/RepositoryIntegrationTests.java index 871938d..4f6d20e 100755 --- a/src/test/java/org/springframework/data/envers/repository/support/RepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/envers/repository/support/RepositoryIntegrationTests.java @@ -51,6 +51,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; * * @author Oliver Gierke * @author Jens Schauder + * @author Niklas Loechte */ @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = Config.class) @@ -68,13 +69,6 @@ class RepositoryIntegrationTests { countryRepository.deleteAll(); } - @AfterEach - void tearDown() { - - licenseRepository.deleteAll(); - countryRepository.deleteAll(); - } - @Test void testLifeCycle() { @@ -246,19 +240,22 @@ class RepositoryIntegrationTests { @Test // #47 void paginationWithEmptyResult() { - check(23L, 0, 0, 0); + check(-23L, 0, 0, 0); } - @Test + @Test // Envers #379 void testSort_pageableByProperty() { + Country de = new Country(); de.code = "de"; de.name = "Deutschland"; de.timestamp = Instant.parse("2000-01-01T00:00:00Z"); countryRepository.save(de); + de.timestamp = Instant.parse("2000-01-04T00:01:00Z"); countryRepository.save(de); + de.timestamp = Instant.parse("2000-01-04T00:00:00Z"); countryRepository.save(de); diff --git a/src/test/java/org/springframework/data/envers/sample/Country.java b/src/test/java/org/springframework/data/envers/sample/Country.java index 8a0a3dd..f11dcd2 100755 --- a/src/test/java/org/springframework/data/envers/sample/Country.java +++ b/src/test/java/org/springframework/data/envers/sample/Country.java @@ -27,6 +27,7 @@ import org.hibernate.envers.Audited; * * @author Oliver Gierke * @author Jens Schauder + * @author Niklas Loechte */ @Audited @Entity