2009-03-12 19 views
16

HQL sorgusunda tarih/saat matematiğinin nasıl gerçekleştirileceğine bakıyorum. Spesifik olarak, current_timestamp() işlevinin sonucundan (x) miktarını nasıl eklerim veya çıkarırız? Ya da bunun için SQL'e düşmem gerekiyor ve hangi veritabanı çalıştırılıyorsa onu desteklemeyi umuyorum?Tarih/Saat Matematik HQL'de mi?

HQL sorgu örneği: saatten daha büyük bir şey istenmeyen, buna rağmen herhangi bir birim olarak timeToSubtract parametre ve saniye en çok tercih edilen olacaktır:

FROM RandomThing 
WHERE randomTime IS NOT NULL AND 
     randomTime >= current_timestamp() AND 
     randomTime <= (current_timestamp() + :timeToAdd) 

I tanımlayabilir.

AYDINLATMA: Bunun kolayca sorgu dışında yapılabileceğini anlıyorum. Ancak, felsefi nedenlerden ötürü, sorgulama sisteminin zamanından ziyade veritabanı sunucusunun zamanını kullanmanın önemli olduğunu varsayalım. Pratik örnek: Son (x) miktarında yapılan tüm girişler için otomatik zaman damgasını sorgularım. Zaman damgası veritabanı sistemi tarafından yapıldığından, veritabanının geçerli zamanını da kullanmak önemlidir.

+0

Ayrıca aynı şeyi arıyorum, timeToAdd bir parametre değil, aynı satırdan bir sütun olması dışında, aynı satır ve tabloya ikinci bir sorgu yapmak mantıklı gelmiyor. – James

cevap

3

, önce zaman damgası almak ve sonra Java maxTimestamp hesaplamak ve getirilen geçmesi için basit hql sorgusu yapabilirsiniz: Muhtemelen hazırda kriterler ve kullanımına kadar geçiş olur zaman damgası ve ccclark gibi bir sorguya hesaplanan maxTimeStamp.

+0

Bence bu en yaygın ve kolay uygulanabilir çözüm. Teşekkürler. – jdmichal

10

Sorguda neden yapmalısınız? Neden sadece java kodunda değil. örneğin

:

From RandomThing 
Where randomTime is not null and 
     randomTime >= :currentTimestamp and 
     randomTime <= :maxTimestamp 

Ve sonra sadece parametrelerini ayarlamak.

+0

İyi cevap. Cevabımla soruya açıklık getirdim. – jdmichal

+2

Java kodu aynı saatte çalışmayabilir ve bazı sorgularda, birkaç saniyelik fark bile sorun yaratabilir. – Quartz

4

Sözdizimini veritabanınızda SQL kullanarak yapıp sonra da özel bir HibernateDialect içinde bir işlev tanımlayabilirsiniz. Örneğin, standart SQL olmayan bir hafta içi fonksiyona ihtiyacımız vardı. , Sen olarak tanımlanabilir olabilir date_diff adlı bir işlev kullanabilirsiniz Senin durumunda

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

: Her veritabanı için lehçesini sınıflandırma ve sonra da bu gibi bir satır eklendi? -? Bazı veritabanlarında veya başkalarında farklı bir şey. Bu şekilde, sorgunuzda ham SQL yazmak zorunda kalmazsınız ve veritabanlarını değiştirmeye ihtiyacınız varsa, bu işlevi sadece lehinize farklı şekilde eşleştirebilirsiniz.

1

HQL olmak zorunda mı? Eğer veritabanı sunucusunun zamana ihtiyacınız varsa

Criteria.add(Restrictions.SQLRestriction("{alias} <= current_timestamp() ")) 
Criteria.add(Restrictions.SQLRestriction("{alias} >= (current_timestamp() + ?) ", 5) 
+1

Bu iki ifadeyi bir HQL sorgusuna karşılık ölçütlere ayırmanın arasındaki fark nedir? – jdmichal

+0

Bu çözüm, zaten bu yaklaşımı izliyorsa yararlı olan CriteriaQuery API'sı ile çalışır. –