J'ai un simple projet Spring Data JPA fonctionnant avec mysql et j'ai besoin de récupérer tous les registres qui correspondent au jour et au mois. La colonne que je dois filtrer est de type Datetime.
1935-12-08 00:00:00
Si je veux le faire dans un niveau de base de données, cela fonctionne bien:
SELECT * FROM my_database.event where event_date LIKE '%-12-08%';
Il traite la date comme une chaîne. Maintenant, je dois le faire dans mon référentiel mais rien ne semble fonctionner. J'ai essayé le basique:
List<Event> findByEventDateLike(
@Param("eventDate") Date eventDate);
mais il indique qu'il renvoie une exception d'argument non valide car il s'agit d'un objet Date. J'ai essayé d'autres combinaisons, mais apparemment les données du printemps jpa ne peuvent pas comparer les dates avec des informations partielles.
REMARQUE: Pour le garder propre, j'essaie d'éviter les phrases @Query mais si c'est la seule façon de procéder, c'est une réponse valide.
Comment puis-je le faire?
Utilisez nativeQuery pour émuler la requête dans la base de données.
@Query(value = "SELECT * FROM events WHERE event_date Like %?1%", nativeQuery = true)
List<Match> findByMatchMonthAndMatchDay(@Param ("eventDate") String eventDate);
La base de données s'occupe de la conversion entre Date/String pour la clause LIKE.
Passer le paramètre comme "-month-day" (par exemple: -12-08) renverra une collection d'événements avec cette chaîne dans le champ de date.
Si votre fournisseur JPA est Hibernate, vous pouvez utiliser year
et month
(et autres fonctions ) dans votre requête JPQL (HQL), par exemple comme ceci:
@Query("select e from Event e where year(e.eventDate) = ?1 and month(e.eventDate) = ?2")
List<Entity> getByYearAndMonth(int year, int month);
Le code ci-dessous fonctionne pour ZonedDateTime (startDate), vous n'avez pas la possibilité de tester contre DateTime pour le moment:
@Query("SELECT b FROM Box b " +
"WHERE EXTRACT (day FROM b.startDate) = :dayOfMonth AND EXTRACT (month FROM b.startDate) = :month")
List<Box> findBoxWithParticularDayAndMonth(@Param("dayOfMonth") Integer dayOfMonth, @Param("month") Integer month);
Usage:
List<Box> boxes = boxRepo.findBoxWithParticularDayAndMonth(22, 5);
Java: Date en chaîne Convertir Java.util.Date en chaîne
@Query("select e from Event e where e.eventDate like %:eventDate%")
List<Entity> findByEventDateLike(@Param("eventDate")String eventDate);
pour moi, le moyen le plus simple est d'analyser Date to String mais j'ai trouvé une autre solution que vous pourriez essayer
% comme% Query au printemps JpaRepositoryhttps://docs.spring.io/spring-data/jpa/docs/current/reference/html/
Contenant
findByFirstnameContaining
… Où x.firstname comme? 1 (paramètre lié enveloppé dans%)