2012-04-01 11 views
1

Ich würde gerne Date() Funktion in Hibernate Kriterien verwenden, da ein Feld Timestamp ist.Wie benutze ich date() in Hibernate Kriterien

My SQL wäre:

"select * from feed where DATE(date) = DATE(NOW()) + INTERVAL 5 DAY" 

Als ich in Kriterien versuchen:

critera.add(Restrictions.eq("DATE(date)", "DATE(NOW()) + INTERVAL 5 DAY")); 

ich:

could not resolve property: DATE(date) of: com.mycomapany.model.Feed 

Ich habe ein Feld mit dem Namen Datum in Futtermitteln .

Was ist das Problem? Ich benutze MySQL

Antwort

4

Die beste Lösung ist die Verwendung der Kriterien api, die Sie zu verwenden begonnen haben.

Calendar c = Calendar.getInstance(LOCALIZATION); 
//Add 5 Days 
c.add(Calendar.DATE, 5); 
criteria.add(Expression.ge("dateColumn",c.getTime()); 
1

Sie könnten wahrscheinlich einen Weg finden, dies zu tun, aber meiner Meinung nach ist dies der falsche Weg, es zu nähern.

Eines der Hauptmerkmale von Hibernate ist die Abstraktion der datenbankanbieterspezifischen Funktionen über Hibernate Dialekt.

Sie versuchen direkt auf MySQL-Funktionen zuzugreifen, aber über die herstellerneutrale Schnittstelle, also Ihre Schwierigkeit. Hibernate Unterstützung für Datumsintervalle haben könnte, ist aber nicht - https://hibernate.onjira.com/browse/HHH-2434

So sehen, scheinen die Optionen zu sein:

  • die Datumsbereiche in Ihrem Code berechnen, anstatt in der HQL
  • Tun Sie, was Sie müssen in SQL statt HQL
  • erstellen Sie eine benutzerdefinierte Hibernate Dialect, wie in Performing Date/Time Math In HQL?
1

mit Joda Time tun:

public List<Feed> findByDaysFromToday(int daysFromToday) { 
    return em.createQuery(
      "SELECT f FROM Feed f WHERE f.date BETWEEN :start AND :end") 
      .setParameter("start", 
          new LocalDate() 
            .toDateMidnight() 
            .toDate(), 
          TemporalType.DATE) 
      .setParameter("end", 
          new LocalDate().plusDays(daysFromToday) 
            .toDateMidnight() 
            .toDateTime() 
            .minusMillis(1) 
            .toDateTime() 
            .toDate(), 
          TemporalType.DATE) 
      .getResultList(); 
}