package com.github.marschall.threeten.jpa.h2; import static org.junit.Assert.assertEquals; import java.math.BigInteger; import java.time.OffsetDateTime; import java.time.ZoneOffset; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import org.junit.Test; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; import com.github.marschall.threeten.jpa.h2.configuration.H2Configuration; @ContextConfiguration(classes = H2Configuration.class) public class H2Test extends AbstractTransactionalJUnit4SpringContextTests { @PersistenceContext private EntityManager entityManager; @Test public void readFirstRow() { JavaTime42WithZone firstRow = this.entityManager.find(JavaTime42WithZone.class, new BigInteger("1")); ZoneOffset zoneOffset = ZoneOffset.ofHoursMinutes(2, 0); OffsetDateTime expectedOffset = OffsetDateTime.of(1960, 1, 1, 23, 3, 20, 123456789, zoneOffset); assertEquals(expectedOffset, firstRow.getOffsetDateTime()); } @Test public void readSecondRow() { JavaTime42WithZone secondRow = this.entityManager.find(JavaTime42WithZone.class, new BigInteger("2")); ZoneOffset zoneOffset = ZoneOffset.ofHoursMinutes(-3, -30); OffsetDateTime expectedOffset = OffsetDateTime.of(1999, 1, 23, 8, 26, 56, 123456789, zoneOffset); assertEquals(expectedOffset, secondRow.getOffsetDateTime()); } @Test public void jpqlNamed() { OffsetDateTime offsetDateTime = OffsetDateTime.parse("1998-01-31T09:26:56.123456789+02:00"); TypedQuery<JavaTime42WithZone> query = this.entityManager.createQuery("SELECT t " + " FROM JavaTime42WithZone t " + " WHERE t.offsetDateTime < :now", JavaTime42WithZone.class); // query.setParameter(1, offsetDateTime); query.setParameter("now", offsetDateTime); JavaTime42WithZone entity = query.getSingleResult(); assertEquals(new BigInteger("1"), entity.getId()); ZoneOffset zoneOffset = ZoneOffset.ofHoursMinutes(2, 0); OffsetDateTime expectedOffset = OffsetDateTime.of(1960, 1, 1, 23, 3, 20, 123456789, zoneOffset); assertEquals(expectedOffset, entity.getOffsetDateTime()); } @Test public void jpqlIndexed() { OffsetDateTime offsetDateTime = OffsetDateTime.parse("1998-01-31T09:26:56.123456789+02:00"); TypedQuery<JavaTime42WithZone> query = this.entityManager.createQuery("SELECT t " + " FROM JavaTime42WithZone t " + " WHERE t.offsetDateTime < ?1", JavaTime42WithZone.class); query.setParameter(1, offsetDateTime); JavaTime42WithZone entity = query.getSingleResult(); assertEquals(new BigInteger("1"), entity.getId()); ZoneOffset zoneOffset = ZoneOffset.ofHoursMinutes(2, 0); OffsetDateTime expectedOffset = OffsetDateTime.of(1960, 1, 1, 23, 3, 20, 123456789, zoneOffset); assertEquals(expectedOffset, entity.getOffsetDateTime()); } @Test public void criteriaApi() { OffsetDateTime offsetDateTime = OffsetDateTime.parse("1998-01-31T09:26:56.123456789+02:00"); CriteriaBuilder builder = this.entityManager.getCriteriaBuilder(); CriteriaQuery<JavaTime42WithZone> query = builder.createQuery(JavaTime42WithZone.class); Root<JavaTime42WithZone> root = query.from(JavaTime42WithZone.class); CriteriaQuery<JavaTime42WithZone> beforeTwelfeFive = query.where( builder.lessThan(root.get(JavaTime42WithZone_.offsetDateTime), offsetDateTime)); JavaTime42WithZone entity = this.entityManager.createQuery(beforeTwelfeFive).getSingleResult(); assertEquals(new BigInteger("1"), entity.getId()); ZoneOffset zoneOffset = ZoneOffset.ofHoursMinutes(2, 0); OffsetDateTime expectedOffset = OffsetDateTime.of(1960, 1, 1, 23, 3, 20, 123456789, zoneOffset); assertEquals(expectedOffset, entity.getOffsetDateTime()); } }