2011-11-17 24 views
5

HQL filtrelemeyi kullanarak bazı varlıkları zamana göre seçmem gerekiyor. Ama sadece tarih bileşenini zaman olmadan karşılaştırmam gerek. Örneğin 1.1.2011 12.00 ve 1.1.2011 13.20 eşit olmalıdır.HQL'de yalnızca tarih bileşenini karşılaştırın

Hangi operatörü kullanabilirim?

@Query("FROM Item item " + 
    "WHERE item.date [equality by date operator] :date ") 
List<Item> findByDate(@Param("date") Date date); 

cevap

8

DB'ye özgü işlevleri önemsemiyorsanız, bunu (örneğin, Oracle'ı kullanarak) gerçekleştirebilirsiniz. OracleDialect bir StandardSQLFunction olarak trunc kaydeder ve Oracle en TRUNC bir tarih zaman bileşeni kaldırır çünkü

@Query("FROM Item item WHERE trunc(item.date) = trunc(:date) ") 
List<Item> findByDate(@Param("date") Date date); 

Bunu kullanabilir.

+0

Hatalardan kaçınmak için Oracle'da, bazı hataları önlemek için trunc (item.date, 'YYYY') 'diyebilirsiniz. –

9

siz (ve sen olmalı) sonra 2 tarihleri ​​ile çalışmak DB özgü işlevler sakıncası yoksa: tarihten itibaren

  1. = ayarlı zamanla tarih = bugüne kadar gece yarısı
  2. ayarlı zaman güncel 23: 59: 59,999

sonra tarihlerde sorgulamak> = tarih ve < itibaren = güncel

+0

Oracle db kullanıyorum ve trunc kullanmak benim için daha iyi. Bizim cevabımız için Tnx – hatesms

+3

İyi ama eğer bu desteklenmeyen bir bellek içi DB ile birim testi yapmak istiyorsanız sıkışmış olacaksınız. –

0
"Select col from Table t where t.date = CURRENT_DATE()" 

bunu deneyin.

İlgili konular