Как выполнять операции с датой в спящем режиме - PullRequest
14 голосов
/ 24 июня 2009

Я хочу выполнять операции с данными с использованием Hibernate HQL.

Я хочу добавить и вычесть две даты, а также вычесть 1 год или 1 месяц из определенной даты.

Как это возможно при использовании HQL в hibernate?

Ответы [ 8 ]

8 голосов
/ 28 октября 2009

Вам нужно создать свой собственный диалект. Примерно так:

public class MyDialect extends MySQLInnoDBDialect{
      public myDialect() {
      super();
      registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
      }
    }
5 голосов
/ 24 июня 2009

См Выполнение даты / времени по математике в HQL? для примера.

Чтобы использовать пользовательский sql, вы должны написать собственный диалект гибернации и зарегистрироваться:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
4 голосов
/ 12 июня 2013

В Hibernate / MySQL (как минимум) Вы можете конвертировать в и из Unix Timestamp. Поскольку метка времени unix является целым числом, вы можете добавить к нему целое число секунд.

FROM_UNIXTIME(UNIX_TIMESTAMP(date)+ (allowedTimeWindow*86400)) as deadline

У него есть ограничения, но это намного проще, чем описанные выше.

4 голосов
/ 15 июля 2010

Это открытый вопрос в Hibernate. Начиная с Hibernate 3.3, стандартного способа сравнения дат в HQL не существует:

https://hibernate.atlassian.net/browse/HHH-2434

Hibernate 4.3 предлагает функции для доступа к дате / времени в HQL:

current_timestamp() , current_date() , current_time()

Арифметическими операциями можно управлять:

SECOND(...) , MINUTE(...) , HOUR(...) , DAY(...) , MONTH(...) , YEAR(...)
1 голос
/ 11 сентября 2012

Отказ от ответственности: я новичок в Java

Мне удалось использовать current_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDate в операторе HQL для базы данных Sybase в Hibernate 3.5.3 без регистрации каких-либо функций.

0 голосов
/ 07 апреля 2018

пользователей Postgres ...

registerFunction("dateadd", new SQLFunctionTemplate(StandardBasicTypes.DATE, "(?1 + INTERVAL ?2)"));

с использованием SQL, например:

now() < dateadd(:mydate, '-1 day')
0 голосов
/ 09 октября 2015

Hibernate4.3 предоставляет встроенные функции для доступа к датам / временным меткам и выполнения арифметических операций с ними

Здесь - ссылка на документацию о том, какие выражения можно использовать в HQL. Немногие из которых я упоминаю: Для доступа к дате / времени:

current_date(), current_time(), and current_timestamp()

Арифметические операции могут быть выполнены следующим образом. Эти функции принимают время в качестве ввода:

second(...), minute(...), hour(...), day(...), month(...), and year(...)

Можно получить абсолютную разницу в HQL по

current_timestamp() - dateInstance

где dateInstance может иметь определение

@Column(name = "updated_at")
@Temporal(TemporalType.TIMESTAMP)
private java.util.Date updatedAt;

Результат за 0,1 секунды. Таким образом, при абсолютной разнице в 1 секунду приведенное выше выражение даст результат как 10.

Таким образом, запрос будет выглядеть так:

select t from Table t where (current_timestamp() - updatedAt)>600
0 голосов
/ 14 июня 2013

Пример использования подхода с диалектом для JPA + Hibernate 4.3.1 + MySQL 5

открытый класс SampleMySQL5InnoDBDialect extends org.hibernate.dialect.MySQL5InnoDBDialect {

public SampleMySQL5InnoDBDialect() {
    super();
    registerFunction("date_sub_days", new SQLFunctionTemplate(StandardBasicTypes.DATE, "date_sub(?1, interval ?2 day)"));
}

тогда для вашего класса с аннотацией сопоставления:

@NamedQuery(name = "SampleEntity.getSampleEntitiesForGapOverlapCalculations", query = "from SampleEntity as se where "
    + "((se.toDate between :startDate and :endDate) or (date_sub_days(se.toDate, se.duration) between :startDate and :endDate)) order by se.toDate asc, se.duration desc")

SampleEntity имеет toDate поле типа java.sql.Date и duration целочисленное поле (длительность в днях), и мы рассчитываем fromDate = toDate - продолжительность и выбираем все объекты, которые имеют fromDate или toDate внутри интервала [startDate, endDate] .

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