Использование критериев 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.