2017-12-08 3 views
1

Ich habe ein einfaches Spring Data JPA-Projekt, das mit mysql arbeitet, und ich muss alle Register abrufen, die Tag und Monat entsprechen. Die Spalte, die ich filtern muss, ist Typ Datetime.Spring Data JPA - Wie kann ich Daten aus einer Datumsspalte nur mit Monat und Tag abrufen?

1935-12-08 00:00:00 

Wenn ich dies in einer DB-Ebene tun will, es funktioniert:

SELECT * FROM my_database.event where event_date LIKE '%-12-08%'; 

Es behandelt das Datum als String zurück. Jetzt muss ich das in meinem Repository tun, aber nichts scheint zu funktionieren. Ich versuchte das grundlegende:

aber es sagt, dass es eine unzulässige Argumentausnahme zurückgibt, da es ein Date-Objekt ist. Ich habe andere Kombinationen ausprobiert, aber anscheinend können die Daten von jpa keine Daten mit partiellen Informationen vergleichen.

HINWEIS: Um es sauber zu halten versuche ich @Query Sätze zu vermeiden, aber wenn es der einzige Weg zu gehen ist, ist es eine gültige Antwort.

Wie kann ich es tun?

+0

Wenn Sie möchten, wie verwenden, ‚%%‘ Sie haben den Typ String – Osgux

+0

chage Wie wäre es ändern Methode Namen 'findByEventDateGreaterThanAndEventDateLessThan (Datum startdate, Datum endDate)' – Zeronex

+0

Sie weitere Details hier https finden: // docs .spring.io/spring-data/jpa/docs/1.5.0.RELEASE/referenz/html/jpa.repositories.html – Zeronex

Antwort

0

Verwenden nativeQuery die Abfrage in der Datenbank zu emulieren.

@Query(value = "SELECT * FROM events WHERE event_date Like %?1%", nativeQuery = true) 
List<Match> findByMatchMonthAndMatchDay(@Param ("eventDate") String eventDate); 

Die DB kümmert sich um die Konvertierung zwischen Date/String für die LIKE-Klausel.

Das Übergeben des Parameters als "-month-day" (z. B. -12-08) gibt eine Auflistung von Ereignissen mit dieser Zeichenfolge im Datumsfeld zurück.

2

Der folgende Code für ZonedDateTime (startdate) arbeitet, haben die Möglichkeit, jetzt nicht gegen Datetime zu testen:

@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); 

Verbrauch:

List<Box> boxes = boxRepo.findBoxWithParticularDayAndMonth(22, 5); 
2

Wenn Ihr JPA-Provider ist Hibernate dann Sie können year und month (und other funcs) in Ihrer JPQL (HQL) -Abfrage verwenden, z. B. wie folgt:

@Query("select e from Event e where year(e.eventDate) = ?1 and month(e.eventDate) = ?2") 
List<Entity> getByYearAndMonth(int year, int month); 
1

Java: Date String Convert java.util.Date to String

@Query("select e from Event e where e.eventDate like %:eventDate%") 
List<Entity> findByEventDateLike(@Param("eventDate")String eventDate); 

für mich der einfache Weg ist Parse-Date String, aber ich fand eine andere Lösung, die Sie

%Like% Query in spring JpaRepository https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

Containing

versuchen könnte

findByFirstnameContaining

... wo x.firstname wie? 1 (Parameter in% gebunden verpackt)