Критерии JPA2 и Java 8 Date&Time API

Я пытаюсь перенести веб-приложение Java на новый API даты и времени Java 8 (используя, среди прочего, типы «LocalDate» и «LocalDateTime»)

В Java 7 java.util.Date можно было использовать в API критериев JPA2 для фильтрации наборов результатов по датам. Обычно это можно сделать, добавив предикат, например.

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

Теперь JPA2 еще не поддерживает новый Java 8 Date&Time API (LocalDate и LocalDateTime). С помощью собственных «преобразователей атрибутов» работа с сущностями уже может быть достигнута, как описано в блоге http://www.thoughts-on-java.org/persist-localdate-localdatetime-jpa/

Теперь к моему вопросу: как я могу использовать LocalDate и LocalDateTime в API критериев JPA2, чтобы фильтровать наборы результатов по LocalDate вместо даты? «Между» в том виде, в каком он использовался ранее, не работает для экземпляров LocalDate.


person Hubert Schumacher    schedule 30.01.2016    source источник
comment
JPA2.2 исправить это или нет?   -  person Krismorte    schedule 02.02.2018
comment
@Krismorte согласно https://www.thoughts-on-java.org/whats-new-in-jpa-2-2/ похоже вы правы. Хотя еще не пробовал   -  person Hubert Schumacher    schedule 03.02.2018
comment
Я тоже сталкиваюсь с этой проблемой, вот мой вопрос stackoverflow. ком/вопросы/48585691/   -  person Krismorte    schedule 04.02.2018


Ответы (1)


С моим LocalDateTimeConverter я только что попробовал greaterThanOrEqualTo и lessThan проверить диапазон LocalDateTime, например

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

и даже

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

работает как положено. Что именно вызывает проблемы с вашим кодом? Может <LocalDateTime> не хватает?

person Steffen Harbich    schedule 15.05.2016