Hibernate Query для извлечения записей по дате без учета метки времени - PullRequest
2 голосов
/ 25 октября 2010

У меня есть столбец метки времени, торгуемый в одной из таблиц БД (Oracle). Я использую Hibernate в качестве постоянного слоя для извлечения и хранения данных в БД. У меня есть требование, в котором мне нужно запросить БД на дату. Т.е. из пользовательского интерфейса пользователь передает дату, и мне нужно получить отфильтрованные данные на основе этой даты.

Если в столбце tradedate есть только часть даты, мой запрос возвращает правильные записи Проблема возникает, когда столбец tradedate заполняется значением метки времени, т. Е. (Дата + время). Тогда эти значения не возвращаются запросом.

Например: скажем, на 23 октября 2010 г. в БД имеется 10 записей, 5 из них имеют записи с отметками времени, а 5 не имеют

Таким образом, запрос, который я имею, возвращает мне только 5 строк, у которых нет метки времени.

Теперь я знаю, что мне нужно извлечь дату из отметки времени, а затем выполнить сравнение, чтобы я получил все записи за приблизительную дату, но я не знаю, как это делается с Hibernate и с использованием HQL

запрос в Java / Hibernate , который я использую, выглядит следующим образом

String hql = "выбрать Очистка из POJO как POJO, где POJO.tradeDate =: date"; Query query = getSession (). CreateQuery (hql); query.setParameter («дата», дата);

1 Ответ

9 голосов
/ 25 октября 2010
String hql = "from POJO as POJO where to_date(to_char(POJO.tradeDate, 'DD-MON-YY'), 'DD-MON-YY') = :date"; 
Query query = getSession().createQuery(hql); 
query.setParameter("date", date); 

[Редактировать]

Осторожно, индекс, если он есть, на tradeDate не будет использоваться, если вы выполните приведенный выше запрос.В случае проблем с производительностью, вы можете сделать это следующим образом:

String hql = "from POJO as POJO where POJO.tradeDate between :date and :ceilDate"; 
Query query = getSession().createQuery(hql); 
// a date having timestamp part, 00:00:00.0, or missing completely
query.setParameter("date", date); 
// a date having timestamp part, 23:59:59.999
query.setParameter("ceilDate", ceilDate); 
...