Каков эквивалент HQL этого специфичного для Oracle запроса?

#java #hibernate

#java #переход в спящий режим

Вопрос:

У меня есть запрос в одном из моих проектов, как показано ниже, который использует специфичный для Oracle материал. Как переписать это в HQL?

 from HotAddressHibId a  where a.expirationTsp >= trunc(SYSDATE)
  

Комментарии:

1. TRUNC(SYSTDATE) фактически сейчас полночь текущего дня.

2. @trashgod это правильно, но мне интересно, является ли это специфичным для orcale или правильным HQL

3. Он специфичен для Oracle, но Hib передает все, что он не понимает, в RDBMS, и поэтому он работает. Однако переносимость нарушена.

4. Просто информация для прохожих. Теперь я вижу, что вы переходите на HQL, а не меняете базы данных.

Ответ №1:

Оба trunc() и sysdate() зарегистрированы как функции на диалекте Hibernate для Oracle, поэтому вы можете просто сделать это:

 from HotAddressHibId a  where a.expirationTsp >= trunc(sysdate()) 
  

Ответ №2:

 "from HotAddressHibId a where a.expirationTsp >= ?"
  

Затем подготовьте объект Date, удалив часы, минуты, секунды и миллисекунды, и привяжите к параметру запроса.

Обратите внимание, что поведение может измениться, если Oracle находится в другом часовом поясе.

Ответ №3:

Вы могли бы использовать запрос критериев гибернации с sqlRestriction:

 List elements = session.createCriteria(HotAddressHibId.class)
    .add( Restrictions.sqlRestriction("expiration_tsp >= trunc(SYSDATE)" )
    .list();