Использование JPA / Hibernate Criteria для переключения между датами - PullRequest
10 голосов
/ 23 ноября 2010

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

Я использую 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.

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

Ответы [ 4 ]

19 голосов
/ 23 ноября 2010

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

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() и т. Д.

10 голосов
/ 18 мая 2015

Вы просто пропускаете вызов 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();
6 голосов
/ 25 октября 2013

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

builder.between(root.<Date>get("dateColumn"), startDate, endDate);
2 голосов
/ 23 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...