2014-01-21 8 views
10

Ich versuche, alle Kunden Datensätze mit HQL in meiner Spring/Hibernate App abzufragen, die Datum zwischen Date1 und Date2 ODER LastSeen zwischen Date1 und Date2 haben, also habe ich diese HQL - Abfrage in der Repository/DAO Klasse:HQL zum Abfragen von Datensätzen zwischen zwei Daten

sessionfactory.getCurrentSession().createQuery("from Customer c where c.dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"' OR c.lastSeenDate BETWEEN '"+startDate+"' AND '"+endDate+"'").list(); 

ich habe die App ausgetestet die startdate und endDate zu überprüfen und festgestellt, dass sie gesendet werden als:

startdate: Mi 22. Januar 01.16.57 HKT 2014

endDatum: Wed Jan 29 01:16:57 HKT 2014

Im DB, ich bin 100% sicher, dass es einen Datensatz mindestens Sitzung in dieser Abfrage ist, wie dieser Datensatz DateAdded und LastSeen sind wie folgt:

2014-01-23 15:33:38

2014 -01-25 15:33:38

Kann mir bitte jemand sagen, was ich hier falsch mache/vermisse?

+2

Ich bin mir nicht sicher, wie Zeitzonen in HQL gehandhabt werden, wenn Daten als Literale übergeben werden, aber Sie sollten wirklich Abfrageparameter anstelle von String-Verkettung verwenden. – Guillaume

+0

@Guillaume, das speziell oder allgemein gesprochen wird, um dieses Problem anzugehen? – MChan

+0

@Guillaume änderte es in sessionfactory.getCurrentSession(). CreateQuery ("aus Customer c wobei c.dateAdded BETWEEN: startD UND: endD"). SetParameter ("startD", startDate) .setParameter ("endD", startDate) .list(); und immer noch wird es nicht funktionieren :( – MChan

Antwort

-1

versuchen, etwas wie folgt aus:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date fromDate = df.parse(startDate); 
Date toDate = df.parse(endDate); 
Criteria criteria = sessionfactory.getCurrentSession().createCriteria(Customer.class) 
    .add(Restrictions.between("dateAdded", fromDate , toDate)); 
List<Customer> listCustomer = criteria.list(); 

this helps .. !!

+1

Dies wird nicht funktionieren, sobald Sie die formatierten Daten zurück zu Datum Objekte alle Format ist – MChan

10
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
String frmDate = format.parse(startDate); 
String enDate = format.parse(endDate); 
sessionfactory.getCurrentSession() 
.createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ") 
.setParameter("stDate", frmDate) 
.setParameter("edDate", enDate) 
.list(); 

hoffe das hilft!

+0

gegangen Dies wird nicht funktionieren, sobald Sie die formatierten Daten zurück zu Datum Objekte alle Format ist – MChan

+0

@Mchan überprüfen Sie meine Updates –

+0

Dies wird auch nicht funktionieren :(Weil setParameter überprüft die übergebene Variablentyp. So wird ein erhöhen Ausnahme: Fehler beim Umwandeln zwischen Zeichenfolge und Datum selbst wenn Sie versucht haben, in setParameter zu konvertieren, wird es nicht funktionieren – MChan

5

Dies ist ein alter Beitrag, aber ich dachte, es könnte jemandem helfen. Die Einstellung .setTimeStamp sollte den Trick machen.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
String frmDate = format.parse(startDate); 
String enDate = format.parse(endDate); 
sessionfactory.getCurrentSession() 
.createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ") 
.setTimestamp("stDate", frmDate) 
.setTimestamp("edDate", enDate) 
.list(); 
2
SimpleDateFormat sf=new SimpleDateFormat("dd-MM-YYYY"); 
String fromDate=null; 
String toDate=null; 
fromDate=sf.format(startDate); 
toDate=sf.format(endDate); 
sessionfactory.getCurrentSession().createQuery("from Customer where dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"'"); 
+1

Sie sollten Ihre Antwort lieber erklären als nur Postleitzahl. – Martin

0

Ich hatte ähnliches Problem. Wenn wir das Enddatum verwenden (Mittwoch, 29. Januar), sucht das System nach Wed Jan 29 00:00:00, was genau wie die Wahl von Jan 28 ist. Um einen solchen Fall zu vermeiden, können wir einen Tag zum Enddatum hinzufügen. Dies erklärt auch, warum wir kein Problem mit dem Startdatum haben.

Überraschenderweise ist dieses Problem nicht vorhanden, wenn wir Winterschlafkriterien verwenden.

0
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy"); 
    Calendar c = Calendar.getInstance(); 
    c.setTime(new Date()); // Now use today date. 
    c.add(Calendar.DATE, 90); 
    Date fromDate = null, toDate = null; 
    String fromDateStr = formatter.format(new Date()); 
    String toDateStr = formatter.format(c.getTime()); 
    try { 
     fromDate = formatter.parse(fromDateStr); 
     toDate = formatter.parse(toDateStr); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    query.setParameter("stDate", fromDate); 
    query.setParameter("edDate", toDate); 
Verwandte Themen