2016-01-30 11 views
7

cerco di porta un'applicazione web Java per il nuovo Java 8 Data & Ora API (utilizzando 'LocalDate' e il tipo 'LocalDateTime' tra gli altri)Criteri JPA2 e Java 8 Data e ora API

In Java 7, Java. util.Date può essere utilizzato nell'API dei criteri JPA2 per filtrare i set di risultati nelle date. Tipicamente si farebbe questo aggiungendo un predicato per es.

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

Ora JPA2 non supporta il nuovo Java 8 Data & Ora API (LocalDate e LocalDateTime) ancora. Con propri "Convertitori Attributo", che lavorano con gli enti possono già essere raggiunto, come descritto nel blog http://www.thoughts-on-java.org/persist-localdate-localdatetime-jpa/

Ora alla mia domanda: come posso usare LocalDate e LocalDateTime a criteri JPA2 API al fine di filtrare i set di risultati su LocalDate anziché Data? 'between' usato in precedenza non funziona per le istanze di LocalDate.

+1

JPA2.2 risolvere questo o no? – Krismorte

+0

@Krismorte secondo [https://www.thoughts-on-java.org/whats-new-in-jpa-2-2/](https://www.thoughts-on-java.org/whats- new-in-jpa-2-2 /) sembra che tu abbia ragione. Anche se non l'ho provato ancora –

+0

Sono di fronte a questo problema anche qui è la mia domanda https://stackoverflow.com/questions/48585691/problems-with-between-localdate-predicate – Krismorte

risposta

2

Con la mia LocalDateTimeConverter, ho appena provato e greaterThanOrEqualTolessThan per verificare la presenza di una gamma LocalDateTime come

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(); 

e anche

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

funziona come previsto. Che cosa sta causando problemi con il tuo codice? Forse <LocalDateTime> manca?