Использование критериев JPA/Hibernate для перехода между датой

Я пытаюсь использовать следующий код, чтобы вытащить список объектов Experience из таблицы MySQL. Каждый из них имеет столбец datetime и столбец datetime, и я хочу только вытаскивать строки, где текущая дата находится между символами from и to.

Я использую JPA 2.0, сбегающий из Hibernate.

    Date currentDate = new Date();
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Experience> query = builder.createQuery(Experience.class);
    Root<Experience> root = query.from(Experience.class);
    builder.between(currentDate, root.get("from"), root.get("to"));
    return entityManager.createQuery(query).getResultList();

Моя проблема в том, что builder.between(), очевидно, не позволит мне передать объект Date.

Есть ли лучшее решение моей проблемы?

Ответ 1

Вы можете передать его как параметр:

ParameterExpression<Date> d = builder.parameter(Date.class);
builder.between(d, root.<Date>get("from"), root.<Date>get("to")); 
return entityManager.createQuery(query)
    .setParameter(d, currentDate, TemporalType.DATE).getResultList(); 

Обратите внимание, что в этом случае вам нужно указать желаемый временный тип.

Также вы можете рассчитывать на текущую дату базы данных: builder.currentDate(), builder.currentTimestamp() и т.д.

Ответ 2

Вам просто не хватает вызова CriteriaBuilder.literal():

Date currentDate = new Date();
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Experience> query = builder.createQuery(Experience.class);
Root<Experience> root = query.from(Experience.class);
builder.between(builder.literal(currentDate), root.get("from"), root.get("to"));
return entityManager.createQuery(query).getResultList();

Ответ 3

Вы должны переключить свои аргументы:

builder.between(root.<Date>get("dateColumn"), startDate, endDate);

Ответ 4

Эта ссылка выглядит многообещающей: http://www.javalobby.org/articles/hibernatequery102/

Вы можете использовать criteria.ge("date", root.get("from")); и criteria.le("date"), root.get("to"));, чтобы создать между claus

Если они недоступны, вам может потребоваться изучить HQL.