From c0d254499547c44298c69f78611716ecbb02c98a Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 10 Feb 2020 15:36:21 +0100 Subject: [PATCH] #553 - Adapt Spring Data JPA. Replace Joda-Time with JSR-310 types. --- jpa/pom.xml | 7 +---- .../showcase/snippets/AccountPredicates.java | 7 +++-- .../snippets/AccountRepositoryCustom.java | 2 +- .../snippets/AccountRepositoryImpl.java | 4 +-- .../snippets/AccountRepositoryJdbcImpl.java | 6 ++-- .../snippets/CustomerSpecifications.java | 28 ++++++++----------- .../AccountRepositoryIntegrationTest.java | 7 ++--- .../CustomerRepositoryIntegrationTest.java | 4 +-- .../CustomerRepositoryIntegrationTest.java | 4 +-- 9 files changed, 30 insertions(+), 39 deletions(-) diff --git a/jpa/pom.xml b/jpa/pom.xml index 82440371..c3124e4b 100644 --- a/jpa/pom.xml +++ b/jpa/pom.xml @@ -14,7 +14,7 @@ Spring Data JPA - Examples Sample projects for Spring Data JPA https://projects.spring.io/spring-data-jpa - 2011-2014 + 2011 example @@ -56,11 +56,6 @@ spring-boot-starter-data-jpa - - joda-time - joda-time - - org.hsqldb hsqldb diff --git a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountPredicates.java b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountPredicates.java index 4835383b..fe6e042e 100644 --- a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountPredicates.java +++ b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountPredicates.java @@ -18,7 +18,8 @@ package example.springdata.jpa.showcase.snippets; import example.springdata.jpa.showcase.core.Account; import example.springdata.jpa.showcase.core.QAccount; -import org.joda.time.LocalDate; +import java.sql.Date; +import java.time.LocalDate; import com.querydsl.core.types.dsl.BooleanExpression; @@ -32,10 +33,10 @@ public class AccountPredicates { private static QAccount account = QAccount.account; public static BooleanExpression isExpired() { - return expiresBefore(new LocalDate()); + return expiresBefore(LocalDate.now()); } public static BooleanExpression expiresBefore(LocalDate date) { - return account.expiryDate.before(date.toDateTimeAtStartOfDay().toDate()); + return account.expiryDate.before(Date.valueOf(date)); } } diff --git a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryCustom.java b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryCustom.java index 255b02ac..787a6297 100644 --- a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryCustom.java +++ b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryCustom.java @@ -15,7 +15,7 @@ */ package example.springdata.jpa.showcase.snippets; -import org.joda.time.LocalDate; +import java.time.LocalDate; /** * @author Oliver Gierke diff --git a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryImpl.java b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryImpl.java index 925492b8..e7c82056 100644 --- a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryImpl.java +++ b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryImpl.java @@ -15,6 +15,7 @@ */ package example.springdata.jpa.showcase.snippets; +import java.time.LocalDate; import java.util.Date; import javax.persistence.EntityManager; @@ -22,7 +23,6 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import org.joda.time.LocalDate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @@ -52,7 +52,7 @@ class AccountRepositoryImpl implements AccountRepositoryCustom { CriteriaQuery query = cb.createQuery(Account.class); Root account = query.from(Account.class); - query.where(cb.lessThan(account.get("expiryDate").as(Date.class), reference.toDateTimeAtStartOfDay().toDate())); + query.where(cb.lessThan(account.get("expiryDate").as(Date.class), java.sql.Date.valueOf(reference))); for (Account each : em.createQuery(query).getResultList()) { em.remove(each); diff --git a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryJdbcImpl.java b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryJdbcImpl.java index 8b1f188c..212c061e 100644 --- a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryJdbcImpl.java +++ b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/AccountRepositoryJdbcImpl.java @@ -15,7 +15,9 @@ */ package example.springdata.jpa.showcase.snippets; -import org.joda.time.LocalDate; +import java.sql.Date; +import java.time.LocalDate; + import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @@ -37,6 +39,6 @@ class AccountRepositoryJdbcImpl implements AccountRepositoryCustom { */ @Override public void removedExpiredAccounts(LocalDate reference) { - template.update("DELETE Account AS a WHERE a.expiryDate < ?", reference.toDateTimeAtStartOfDay().toDate()); + template.update("DELETE Account AS a WHERE a.expiryDate < ?", Date.valueOf(reference)); } } diff --git a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/CustomerSpecifications.java b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/CustomerSpecifications.java index a5737e96..e850e0ca 100644 --- a/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/CustomerSpecifications.java +++ b/jpa/showcase/src/snippets/java/example/springdata/jpa/showcase/snippets/CustomerSpecifications.java @@ -15,20 +15,18 @@ */ package example.springdata.jpa.showcase.snippets; +import example.springdata.jpa.showcase.core.Account; +import example.springdata.jpa.showcase.core.Customer; + +import java.time.LocalDate; import java.util.Date; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import org.joda.time.LocalDate; import org.springframework.data.jpa.domain.Specification; -import example.springdata.jpa.showcase.core.Account; -import example.springdata.jpa.showcase.core.Customer; - /** * Collection of {@link Specification} implementations. * @@ -42,20 +40,16 @@ public class CustomerSpecifications { * @param date * @return */ - public static Specification accountExpiresBefore(final LocalDate date) { + public static Specification accountExpiresBefore(LocalDate date) { - return new Specification() { + return (Specification) (root, query, cb) -> { - @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { + Root accounts = query.from(Account.class); + Path expiryDate = accounts. get("expiryDate"); + Predicate customerIsAccountOwner = cb.equal(accounts. get("customer"), root); + Predicate accountExpiryDateBefore = cb.lessThan(expiryDate, java.sql.Date.valueOf(date)); - Root accounts = query.from(Account.class); - Path expiryDate = accounts. get("expiryDate"); - Predicate customerIsAccountOwner = cb.equal(accounts. get("customer"), root); - Predicate accountExpiryDateBefore = cb.lessThan(expiryDate, date.toDateTimeAtStartOfDay().toDate()); - - return cb.and(customerIsAccountOwner, accountExpiryDateBefore); - } + return cb.and(customerIsAccountOwner, accountExpiryDateBefore); }; } } diff --git a/jpa/showcase/src/test-snippets/java/example/springdata/jpa/showcase/snippets/test/AccountRepositoryIntegrationTest.java b/jpa/showcase/src/test-snippets/java/example/springdata/jpa/showcase/snippets/test/AccountRepositoryIntegrationTest.java index 62dd8fdb..b037e5c6 100644 --- a/jpa/showcase/src/test-snippets/java/example/springdata/jpa/showcase/snippets/test/AccountRepositoryIntegrationTest.java +++ b/jpa/showcase/src/test-snippets/java/example/springdata/jpa/showcase/snippets/test/AccountRepositoryIntegrationTest.java @@ -23,10 +23,9 @@ import static org.junit.Assert.assertThat; import example.springdata.jpa.showcase.core.Account; import example.springdata.jpa.showcase.snippets.AccountRepository; +import java.time.LocalDate; import java.util.Optional; -import org.joda.time.LocalDate; - /** * @author Oliver Gierke */ @@ -36,7 +35,7 @@ public abstract class AccountRepositoryIntegrationTest { public void removesExpiredAccountsCorrectly() throws Exception { - accountRepository.removedExpiredAccounts(new LocalDate(2011, 1, 1)); + accountRepository.removedExpiredAccounts(LocalDate.of(2011, 1, 1)); assertThat(accountRepository.count(), is(1L)); } @@ -45,7 +44,7 @@ public abstract class AccountRepositoryIntegrationTest { Optional expired = accountRepository.findById(1L); Optional valid = accountRepository.findById(2L); - Iterable findAll = accountRepository.findAll(expiresBefore(new LocalDate(2011, 3, 1))); + Iterable findAll = accountRepository.findAll(expiresBefore(LocalDate.of(2011, 3, 1))); assertThat(findAll).contains(expired.get()); assertThat(findAll).doesNotContain(valid.get()); diff --git a/jpa/showcase/src/test-snippets/java/example/springdata/jpa/showcase/snippets/test/CustomerRepositoryIntegrationTest.java b/jpa/showcase/src/test-snippets/java/example/springdata/jpa/showcase/snippets/test/CustomerRepositoryIntegrationTest.java index 484826ff..5e55e266 100644 --- a/jpa/showcase/src/test-snippets/java/example/springdata/jpa/showcase/snippets/test/CustomerRepositoryIntegrationTest.java +++ b/jpa/showcase/src/test-snippets/java/example/springdata/jpa/showcase/snippets/test/CustomerRepositoryIntegrationTest.java @@ -21,10 +21,10 @@ import static org.assertj.core.api.Assertions.*; import example.springdata.jpa.showcase.after.CustomerRepository; import example.springdata.jpa.showcase.core.Customer; +import java.time.LocalDate; import java.util.List; import java.util.Optional; -import org.joda.time.LocalDate; import org.springframework.data.jpa.domain.Specification; /** @@ -40,7 +40,7 @@ public class CustomerRepositoryIntegrationTest { Optional dave = repository.findById(1L); - LocalDate expiryLimit = new LocalDate(2011, 3, 1); + LocalDate expiryLimit = LocalDate.of(2011, 3, 1); List result = repository.findAll(accountExpiresBefore(expiryLimit)); assertThat(result).hasSize(1); diff --git a/jpa/showcase/src/test/java/example/springdata/jpa/showcase/after/CustomerRepositoryIntegrationTest.java b/jpa/showcase/src/test/java/example/springdata/jpa/showcase/after/CustomerRepositoryIntegrationTest.java index 2def1ab5..bec7bfea 100644 --- a/jpa/showcase/src/test/java/example/springdata/jpa/showcase/after/CustomerRepositoryIntegrationTest.java +++ b/jpa/showcase/src/test/java/example/springdata/jpa/showcase/after/CustomerRepositoryIntegrationTest.java @@ -20,10 +20,10 @@ import static org.assertj.core.api.Assertions.*; import example.springdata.jpa.showcase.AbstractShowcaseTest; import example.springdata.jpa.showcase.core.Customer; +import java.time.LocalDate; import java.util.List; import java.util.Optional; -import org.joda.time.LocalDate; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -66,7 +66,7 @@ public class CustomerRepositoryIntegrationTest extends AbstractShowcaseTest { Optional dave = repository.findById(1L); - LocalDate expiryLimit = new LocalDate(2011, 3, 1); + LocalDate expiryLimit = LocalDate.of(2011, 3, 1); List result = repository.findAll(accountExpiresBefore(expiryLimit)); assertThat(result).hasSize(1);