web-dev-qa-db-fra.com

Comparer uniquement la date (sans heure) en JPA2 (JPQL)

J'essaie de comparer Calendars avec JPA2. La requête ressemble un peu à ça:

TypedQuery<X> q = em.createQuery("select r from Record r where r.calendar= :calendar", X.class);
Calendar c = foo(); // setting fields and stuff
q.setParameter("calendar", c);

Ceci, cependant, compare la date + heure. Je veux savoir si MM: DD: AAAA est égal et ne se soucie pas du temps. Existe-t-il un bon moyen de faire cela dans JPA2 ou dois-je créer une requête native?

J'ai essayé de mettre HH: MM: SS: ... à zéro avant de l'enregistrer dans la base de données, mais je ne sais pas si c'est très sage, en ce qui concerne les fuseaux horaires, l'heure d'été, etc.

14
atamanroman
q.setParameter("calendar", c, TemporalType.DATE)

Vous pouvez passer la méthode TemporalType.DATE à setParameter pour tronquer la date et l'heure.

26
Otávio Garcia

Il n’ya aucune mention des fonctions DateTime permettant de le faire dans les spécifications de JPQL, mais vous pouvez toujours tricher et faire

select r from Record r where r.calendar >= :theDayAtZeroOClock and r.calendar < :theDayAfterAtZeroOClock
8
JB Nizet

Comparaison des dates compatibles Mysql et H2 en ignorant la partie heure:

`@Query("SELECT DISTINCT s " +
        "FROM Session s " +
        "JOIN s.movie m " +
        "WHERE m.id = :movie AND CAST(s.time AS date) = CAST(:date AS date) " +
        "ORDER BY s.time")
List<Session> getByMovieAndDate(@Param("movie") Long movie, @Param("date") LocalDateTime date);`
0
pshvetso

Ma solution fonctionnait avec les données de printemps jpa @query:

select * from table_name where substring(something.date, 1,10) = substring(date_from_param, 1,10)

Cela fonctionne bien, mais vous devez vous assurer que la date est toujours au format correct.

0
RichardK

Je devais utiliser date_trunc sur la clause where:

    TypedQuery<X> q = em.createQuery("select r from Record r where date_trunc('day',r).calendar= :calendar", X.class);
Calendar c = foo(); // setting fields and stuff
q.setParameter("calendar", c, TemporalType.DATE);
0
Roger