it-swarm.dev

Cara melakukan operasi tanggal di hibernasi

Saya ingin melakukan operasi waktu data menggunakan hibernate HQL.

Saya ingin menambah dan mengurangi dua tanggal serta saya ingin mengurangi 1 tahun atau 1 bulan dari tanggal tertentu.

Bagaimana ini mungkin menggunakan HQL di hibernate?

13
amar4kintu

Lihat Pertunjukan Tanggal/Waktu Matematika Dalam HQL? sebagai contoh.

Untuk menggunakan sql khusus, Anda harus menulis dialek hibernasi sendiri dan mendaftar:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
5
H2000

Anda perlu membuat dialek Anda sendiri. Sesuatu seperti yang berikut ini:

public class MyDialect extends MySQLInnoDBDialect{
      public myDialect() {
      super();
      registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
      }
    }
8
z5h

Ini adalah masalah terbuka di Hibernate. Pada Hibernate 3.3 tidak ada cara standar untuk menangani perbandingan tanggal murni di HQL:

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

Hibernate 4.3 menawarkan fungsi untuk mengakses Tanggal/Waktu dalam HQL yaitu:

current_timestamp() , current_date() , current_time()

Operasi aritmatika dapat dikelola oleh:

SECOND(...) , MINUTE(...) , HOUR(...) , DAY(...) , MONTH(...) , YEAR(...)
4
Fred Haslam

Di Hibernate/MySQL (setidaknya) Anda dapat mengonversi ke dan dari Cap Waktu Unix. Karena cap waktu unix adalah bilangan bulat, Anda dapat menambahkan jumlah bilangan bulat detik untuknya.

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

Ini memiliki keterbatasan tetapi jauh lebih mudah daripada pendekatan di atas.

4
Dean Mathieson

Penafian: Saya pemula di Jawa

Saya bisa menggunakan current_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDate dalam pernyataan HQL terhadap Sybase db di Hibernate 3.5.3, tanpa mendaftarkan fungsi apa pun.

1
foson

Contoh penggunaan pendekatan dengan dialek untuk JPA + Hibernate 4.3.1 + MySQL 5

sampleMySQL5InnoDBDialect kelas publik meluas org.hibernate.dialect.MySQL5InnoDBDialect {

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

lalu untuk kelas Anda dengan memetakan anotasi:

@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 memiliki toDate bidang tipe Java.sql.Date dan durasi bidang bilangan bulat (durasi dalam hari) dan kami menghitung fromDate = toDate - durasi dan memilih semua entitas yang memiliki fromDate atau toDate interval dalam [ startDate, endDate] .

0
ydrozhdzhal

Pengguna postgres ...

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

dengan penggunaan SQL seperti:

now() < dateadd(:mydate, '-1 day')
0
Joseph Valerio

Hibernate4.3 menyediakan fungsi asli untuk mengakses Tanggal/Stempel Waktu dan untuk melakukan operasi aritmatik pada mereka

Here adalah tautan ke dokumentasi ekspresi apa yang dapat digunakan dalam HQL. Beberapa yang saya sebutkan: Untuk mengakses tanggal/waktu:

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

Operasi aritmatika dapat dilakukan dengan mengikuti. Fungsi-fungsi ini membutuhkan waktu sebagai input:

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

Orang bisa mendapatkan perbedaan mutlak dalam HQL oleh

current_timestamp() - dateInstance

di mana dateInstance dapat memiliki definisi

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

Hasilnya dalam 0,1 detik. Jadi untuk perbedaan absolut 1 detik, ungkapan di atas akan memberikan hasil 10.

Jadi kueri akan terlihat seperti:

select t from Table t where (current_timestamp() - updatedAt)>600
0
Nikhil Sahu