2016-04-30 2 views
2

Я использую hibernate 5 с аддоном hibernate-java8 для использования полей LocalDateTime. Теперь у меня есть объект, который имеет поле даты и поле пользователя, как в:Hibernate: использование LocalDateTime для запроса диапазона

@Entity 
public class Transaction { 
    // ... 
    private User user; 
    private LocalDateTime date; 
    // .. 
} 

Теперь я просто хочу, чтобы запросить все сделки пользователей в течение определенного интервала времени. Поэтому я использую следующий запрос:

SELECT t FROM Transaction t WHERE t.user = :owner AND t.date BETWEEN :from AND :to 

Странно достаточно, чтобы этот запрос не дал мне никаких результатов. Я также попытался использовать операторыи >, но это тоже не помогло. Когда я оставляю часть диапазона времени, я получаю правильный список транзакций для пользователя. Когда я выполняю SQL-запрос, сгенерированный Hibernate в workbench MySQL, я также получаю ожидаемые результаты. Я использую следующий фрагмент кода для выполнения (с именем) запрос:

public <T> List<T> findList(Class<T> type, String queryName, 
     Map<String, Object> params) { 
    final EntityManager em = this.entityManager.get(); 
    final TypedQuery<T> query = em.createNamedQuery(queryName, type); 
    params.forEach(query::setParameter); 
    return query.getResultList(); 
} 

Это называется просто предоставление перечисленных выше запрос и отображение именованных параметров, как:

findList(Transaction.class, Transaction.BY_USER_AND_RANGE, 
      ImmutableMap.of("owner", owner, "from", from, "to", to)); 

В моем тестовом случае сохранялось одна транзакция с текущей датой и создала диапазон от вчера до завтра для запроса. Проверка таблицы в рабочем месте MySQL показывает, что транзакция есть и что поле даты имеет правильный тип и содержит правильное значение. Однако мой запрос не даст мне никаких результатов.

Есть ли что-нибудь, что мне не хватает?

+2

Каковы значения от и до? Логическое объяснение, если это от больше, чем до. Или что ваши даты не между ними. –

ответ

2

Дата вы передаете в качестве паров также должна быть

LocalDateTime см пример ниже код может помочь вам

LocalDate date = LocalDate.of(2015, 8, 11); 
TypedQuery<MyEntity> query = this.em.createQuery("SELECT e FROM MyEntity e WHERE date BETWEEN :start AND :end", MyEntity.class); 
query.setParameter("start", date.minusDays(2)); 
query.setParameter("end", date.plusDays(7)); 
MyEntity e = query.getSingleResult(); 
Смежные вопросы