Извлечение времени из отметки времени в запросе Hibernate - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь отфильтровать записи в HQL с датами временных отметок для определенного диапазона времени.Например, получить все элементы, созданные между 13:00 и 15:00 за последний месяц.

Моя первоначальная идея состояла в том, чтобы приводить поле метки времени к ::time из PostgreSQL.Но Hibernate не имеет этой встроенной функции (я использую HQL для построения запросов).

Кажется, что есть функция date , но нет средства форматирования времени.У меня нет строгих требований к реализации, и я могу настроить решение, если оно соответствует основной идее.Теперь я отправляю границы даты в виде меток времени и значения времени в виде строк и делаю два параллельных сравнения between.

@Query("SELECT t FROM Table t WHERE t.status.id = ?1"
            + " AND t.startDate >= ?2 AND t.startDate <= ?3"
            + " AND t.startDate::time >= ?4 AND t.startDate::time <= ?5")
Page<Item> findByStatusIdAndDateRange(Long activeId, final long startDate, final long endDate, final String startTime, final String endTime, Pageable pageRequest);

Это не рабочий код, поэтому нет проблем с производительностью при приведении значений в запросе.

Спасибо за любой совет!

1 Ответ

0 голосов
/ 22 сентября 2018

Документация предполагает, что вы можете «извлечь» час из столбца отметки времени:

extract(field FROM source) 

Источник должен быть датой, отметкой времени, интервалом или строкой, которую можно преобразовать в дату илиметка времени.Поддерживаются следующие поля: день, день недели, час, минута, месяц, квартал, секунда, неделя и год.https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-TypeConversionFunctions

и тогда вы сможете использовать это в предложении where

SELECT t.*
FROM Table t 
WHERE t.status.id = ?1
AND t.startDate >= ?2 AND t.startDate <= ?3
AND extract(hour FROM t.startDate)   >= ?4 
AND extract(hour FROM t.startDate)  <= ?5
...