2010-11-23 4 views
10

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

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

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.

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

ответ

19

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

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

+1

Спасибо, что отлично. Моя проблема в том, что по какой-то причине root.get («from») возвращает объект Path, а не объект Expression? – christophmccann 2010-11-23 13:59:58

2

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

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

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

+1

отформатированный бит, теперь он выглядит лучше – 2010-11-23 13:46:29

6

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

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

Вы просто отсутствующий вызов 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(); 
Смежные вопросы