web-dev-qa-db-de.com

JPA - Rückgabe von Entitäten, die nach StartDate und Before EndDate liegen

Ich habe zwei Termine in meiner Entität. dh.

Date startDate;
Date endDate;

Wie frage ich ab, dass bei einem Datum alle Entitäten zurückgegeben werden, bei denen das angegebene Datum zwischen startDate und endDate liegt?

Ich habe schon folgendes ausprobiert:

findByStartDateAfterAndEndDateBefore(Date givenDate);

Und Spring-Data-JPA hat das nicht gemocht und ist auf Fehler gestoßen. Es gibt keinen spezifischen Fehler und das Repo kann meiner Klasse nicht injiziert werden.

Was ist der richtige Weg? Ich weiß, dass dies mit Hibernate-Kriterien oder mit Native SQL problemlos möglich ist, aber dies in Spring JPA zu tun versucht.

Ist dies ein Problem mit der Abfrage selbst oder eine Art Inkompatibilität zwischen den von Spring verwendeten Datumstypen?

Versuchte findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate) und gibt jedoch null zurück.

Sie können aufgrund von Spring Data-Einschränkungen nicht nur einen Parameter verwenden. Sie können diesen Code jedoch mit folgendem Code umgehen:

List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date startDate, Date endDate);

default List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date givenDate) {
    return findByStartDateBeforeAndEndDateAfter(givenDate, givenDate);
}

Dieser Code sollte Ihre Bedürfnisse abdecken. Ich habe es auch mit Spring Boot 1.5.9 überprüft. mit spring-data-get-started Beispiel .

10

Zu meiner Überraschung LessThan und GreaterThan funktionieren und Before und After schlecht ausfallen.

Ich hätte nie gedacht, dass ich weniger und mehr als Datumsangaben verwenden kann und immer auf Datumsfunktionen wie zwischen, vor, nachher schaue. 

Das liegt hauptsächlich am Dokumentationsbeispiel 

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

Also habe ich mir die Dokumente von Spring Data JPA genauer angesehen und mit dem folgenden Beispiel etwas Interessantes gefunden 

 LocalDate date = new LocalDate().minusYears(2);
 return builder.lessThan(root.get(_Customer.createdAt), date);

Beim Vergleich von datatime verwenden die Autoren die Kriterien lessthan für die time-Eigenschaft. 

So gab ein Schuss mit weniger als und arbeitete und gab einen Schuss mit mehr als auch und später zusammen. Also kam ich zu einer Schlussfolgerung 

public MyDateEntity findByStartDateLessThanAndEndDateGreaterThan(Date sDate, Date eDate); 

Und das funktioniert soweit. Und ich glaube, es muss einen sauberen Weg geben, um Daten wahrscheinlich mit before,after,between zu verarbeiten, aber ich kann das einfach nicht verstehen. 

Wäre toll, wenn jemand das herausfindet.

5
Suresh Atta

Sie verwenden die AND-Bedingung in Ihrer JPA-Abfrage, stellen jedoch nur einen Parameter bereit. Sie sollten wie findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate); verwenden

2
Hiren

Da Sie nur das Date-Objekt als Äquivalent zu LocalDate benötigen, sollte dies den Trick erfüllen.

default List<AnEntity> findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(endDate);
    cal.add(Calendar.DATE, -1);
    return findByStartDateBetween(startDate, cal.getTime());
}

Da Sie möchten, dass der Anfang und nicht das Ende eingeschlossen wird und SQL BETWEEN inklusiv ist, verschieben wir das Ende nur einen Tag zurück.

2
coladict
    Public List<EntityClass> findData(Date startDate,Date endDate)
   {
     Query<EntityClass> _q = em.createQuery("select a.* from _tableName a 
                         where a.startDate>= :d1 AND a.endDate<= :d2");
    _q.setParameter("d1", startDate, TemporalType.DATE);
    _q.setParameter("d2", endDate, TemporalType.DATE);
    List<EntityClass> result = query.getResultList();
    em.getTransaction().commit();
    return result;
   }
2

Ich benutze es ohne Probleme wie folgt:

findAllByEntityNotNullAndDateBetween(Date begin, Date end);

Hast du es schon probiert?

0
fabioresner