2013-04-22 1 views
0

У меня есть таблица, в которой есть два столбца временной метки, которые представляют effective и expiration дат, и мне нужно получить те строки, где текущая временная метка падает в этих двух столбцах даты.Дата в двух столбцах даты на основе некоторого условия в Hibernate

Это можно сделать, поставив условие в SQL-запрос следующим образом:
effectiveDate <= current_timestamp and current_timestamp < expirationDate.

Проблема заключается в том, что вышеуказанное условие должно быть выполнено, если expirationDate не является нулевым. Если он равен нулю, то будет проверяться только
effectiveDate <= current_timestamp.

Это своего рода динамический SQL, я думаю. Я использую Hibernate в проекте. Я могу использовать любой критерий API или HQL или SQL что угодно.

Пожалуйста, дайте мне знать, как это можно сделать.

ответ

1

Ваша первая версия не совсем SQL. Но вы хотите что-то вроде:

where effectiveDate <= current_timestamp and 
     (expirationDate is NULL or current_timestamp < expirationDate) 
0

В SQL-запросе нет ничего динамического. Попробуйте это:

Criteria c = sf.getCurrentSession().createCriteria(MyObject.class) 
    .add(Restrictions.lt("effectiveDate",dateArgument)) 
    .add(Restrictions.or(
     Restrictions.isNull("expirationDate"), 
     Restrictions.gt("expirationDate",dateArgument))); 

Вызов c.list() будет возвращать каждый MyObject который имеет effectiveDate меньше заданной даты И также имеет expirationDate, который либо null или больше указанной даты.

Должен предоставить вам то, что вы хотите, до тех пор, пока вы не возражаете против использования запросов на спящий режим.

Примечание: Не стесняйтесь обмениваться .lt(...) и .gt(...) с .le(...) и .ge(...) в зависимости от конкретных требований.

Смежные вопросы