2016-01-30 22 views
7

próbuję portu aplikacji internetowych Java do nowego Java 8 Data & Czas API (używając 'LOCALDATE' i typów 'LocalDateTime' między innymi)JPA2 Kryteria i Java 8 Data i godzina API

w Java 7, Jawa. util.Date może być użyty w API kryteriów JPA2 do filtrowania zestawów wyników w datach. Zazwyczaj można to zrobić, dodając predykat np.

.. 
predicatesList.add(builder.between(from.get(AccountLog_.valueDate), fromDate, toDate)); 
.. 

Teraz JPA2 nie obsługuje nową Java 8 Data & Czas API (LOCALDATE i LocalDateTime) jeszcze. Z własnych „atrybut Konwertery”, we współpracy z podmiotami mogą już być osiągnięte w sposób opisany w blogu http://www.thoughts-on-java.org/persist-localdate-localdatetime-jpa/

Teraz moje pytanie: w jaki sposób mogę korzystać LOCALDATE i LocalDateTime w kryteriach JPA2 API w celu filtrowania zestawów wyników na LOCALDATE zamiast daty? Opcja "pomiędzy" użyta poprzednio nie działa dla instancji LocalDate.

+1

JPA2.2 naprawić, czy nie? – Krismorte

+0

@Krismorte zgodnie z [https://www.thoughts-on-java.org/whats-new-in-jpa-2-2/](https://www.thoughts-on-java.org/whats- new-in-jpa-2-2 /) wydaje się, że masz rację. Chociaż jeszcze tego nie wypróbowałem –

+0

Mam ten problem również tutaj, oto moje pytanie https://stackoverflow.com/questions/48585691/problems-with-between-localdate-predicate – Krismorte

Odpowiedz

2

Z moim LocalDateTimeConverter, po prostu starał greaterThanOrEqualTo i lessThan celu sprawdzenia zakresu LocalDateTime jak

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Meal> query = cb.createQuery(Meal.class); 
Root<Meal> m = query.from(Meal.class); 
query.select(m); 
query.where(
    cb.greaterThanOrEqualTo(m.<LocalDateTime> get(Meal.FIELD_WHEN), cb.literal(begin)), 
    cb.lessThan(m.<LocalDateTime> get(Meal.FIELD_WHEN), cb.literal(end)) 
    ); 

return em.createQuery(query).getResultList(); 

a nawet

cb.between(m.<LocalDateTime> get(Meal.FIELD_WHEN), cb.literal(begin), cb.literal(end)) 

działa zgodnie z oczekiwaniami. Co dokładnie powoduje problemy z kodem? Może brakuje <LocalDateTime>?