J'essaie d'interroger tous les enregistrements de clients utilisant HQL dans mon application Spring/Hibernate pour lesquels DateAdded est entre Date1 et Date2 OR LastSeen entre Date1 et Date2.
sessionfactory.getCurrentSession().createQuery("from Customer c where c.dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"' OR c.lastSeenDate BETWEEN '"+startDate+"' AND '"+endDate+"'").list();
J'ai débogué l'application pour vérifier les dates startDate et endDate et j'ai constaté qu'elles étaient envoyées en tant que:
startDate: mer. 22 janv. 01:16:57 HKT 2014
endDate: mer. 29 janv. 01:16:57 HKT 2014
Dans la base de données, je suis sûr à 100% qu’un enregistrement répondant au moins à cette requête, car cet enregistrement DateAdded et LastSeen sont les suivants:
2014-01-23 15:33:38
2014-01-25 15:33:38
Alors quelqu'un peut-il me dire ce que je fais mal/manque ici?
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();
espérons que cela aidera!
Ceci est un ancien post, mais je pensais que cela pourrait aider quelqu'un. Définir .setTimeStamp devrait faire l'affaire.
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();
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+"'");
Il est important de savoir que lorsque vous utilisez BETWEEN, “setDate” tronque la valeur de date HQL passée en paramètre et ignore les heures, les minutes et les secondes. Il est très important de noter cela en particulier si vous avez une requête HQL vérifiant entre des dates de jours différents, car l'utilisation de «setDate» interprétera l'intervalle de dates comme se situant entre minuit des dates spécifiées.
La solution consiste à utiliser «setParameter» au lieu de «setDate», ce qui entraîne l'interprétation des valeurs de date HQL en tant que dates et heures.
voici quelques exemples sur mon site pour les personnes intéressées http://www.coding-dude.com/wp/Java/hql-date-datetime-quick-tip/
Vous devez annoter avec @JsonFormat de la même manière que les filtres de date et le champ de date comme suit:
Class Filter {
...
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
private Date startDate;
}
Class YourObject {
...
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
private Date DateAdded;
}
Le modèle et le fuseau horaire doivent être ajustés à votre région.
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);
J'ai eu le même problème. Lorsque nous utilisons la date de fin (mercredi 29 janvier), le système recherche le mercredi 29 janvier à 00:00:00, ce qui revient à choisir le 28 janvier. Pour éviter un tel cas, nous pouvons ajouter un jour à la date de fin. Cela explique également pourquoi nous n’avons pas de problème avec la date de début.
Étonnamment, ce problème n'existe pas lorsque nous utilisons des critères d'hibernation.