Abfragen von Entitäten nach Datum und Uhrzeit mit Spring Data JPA
1. Einführung
In diesem kurzen Tutorial erfahren Sie, wie Sie mit Spring Data JPA Entitäten nach Datum abfragen.
Wir werden zunächst unser Gedächtnis darüber auffrischen, wie Datum und Uhrzeit mit JPA zugeordnet werden.
Anschließend erstellen wir eine Entität mit Datums- und Zeitfeldern sowie ein Spring Data-Repository, um diese Entitäten abzufragen.
2. Daten und Zeiten mit JPA zuordnen
Für den Anfangwe’ll review a bit of theory about mapping dates with JPA. Zu wissen ist, dass wir uns entscheiden müssen, ob wir vertreten wollen:
-
Nur ein Datum
-
Nur eine Zeit
-
Oder beides
Zusätzlich zur Annotation (optional)@Columnmüssen wir die Annotation@Temporalhinzufügen, um anzugeben, was das Feld darstellt.
Diese Annotation nimmt einen Parameter an, der einen Wert vonTemporalType enum hat:
-
TemporalType.DATE
-
TemporalType.TIME
-
TemporalType.TIMESTAMP
Ein ausführlicher Artikel über die Zuordnung von Datum und Uhrzeit mit JPA finden Sie unterhere.
3. In der Praxis
In der Praxis ist nach der korrekten Einrichtung unserer Entitäten nicht viel Arbeit erforderlich, um sie mit Spring Data JPA abzufragen. Wir müssen nurquery methods, @Query annotation verwenden.
Every Spring Data JPA mechanism will work just fine.
Sehen wir uns einige Beispiele für Entitäten an, die mit Spring Data JPA nach Datum und Uhrzeit abgefragt wurden.
3.1. Eine Entität einrichten
Nehmen wir zunächst an, wir haben eineArticle-Entität mit einem Veröffentlichungsdatum, einer Veröffentlichungszeit sowie einem Erstellungsdatum und einer Erstellungszeit:
@Entity
public class Article {
@Id
@GeneratedValue
Integer id;
@Temporal(TemporalType.DATE)
Date publicationDate;
@Temporal(TemporalType.TIME)
Date publicationTime;
@Temporal(TemporalType.TIMESTAMP)
Date creationDateTime;
}
Wir teilen Datum und Uhrzeit der Veröffentlichung zu Demonstrationszwecken in zwei Felder auf. Auf diese Weise werden die drei Zeittypen dargestellt.
3.2. Fragen Sie die Entitäten ab
Nachdem unsere Entität eingerichtet ist, erstellen wir Spring Datarepository, um diese Artikel abzufragen.
Wir erstellen drei Methoden mit mehreren Spring Data JPA-Funktionen:
public interface ArticleRepository
extends JpaRepository {
List findAllByPublicationDate(Date publicationDate);
List findAllByPublicationTimeBetween(
Date publicationTimeStart,
Date publicationTimeEnd);
@Query("select a from Article a where a.creationDateTime <= :creationDateTime")
List findAllWithCreationDateTimeBefore(
@Param("creationDateTime") Date creationDateTime);
}
Also haben wir drei Methoden definiert:
-
findAllByPublicationDate, mit dem Artikel abgerufen werden, die an einem bestimmten Datum veröffentlicht wurden
-
findAllByPublicationTimeBetween, mit dem Artikel abgerufen werden, die zwischen zwei Stunden veröffentlicht wurden
-
undfindAllWithCreationDateTimeBefore, die Artikel abrufen, die vor einem bestimmten Datum und einer bestimmten Uhrzeit erstellt wurden
Die beiden ersten Methoden basieren auf dem Mechanismus von Spring Dataquery methodsund die letzte auf der Annotation von@Query.
Dies ändert letztendlich nichts an der Art und Weise, wie Daten behandelt werden. The first method will only consider the date part of the parameter.
Die Sekunde berücksichtigt nur die Zeit der Parameter. Und der letzte verwendet sowohl Datum als auch Uhrzeit.
3.3. Testen Sie die Abfragen
Als letztes müssen wir einige Tests einrichten, um zu überprüfen, ob diese Abfragen wie erwartet funktionieren.
Wir importieren zuerst einige Daten in unsere Datenbank und erstellen dann die Testklasse, die jede Methode des Repositorys überprüft:
@RunWith(SpringRunner.class)
@DataJpaTest
public class ArticleRepositoryIntegrationTest {
@Autowired
private ArticleRepository repository;
@Test
public void whenFindByPublicationDate_thenArticles1And2Returned() {
List result = repository.findAllByPublicationDate(
new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-01"));
assertEquals(2, result.size());
assertTrue(result.stream()
.map(Article::getId)
.allMatch(id -> Arrays.asList(1, 2).contains(id)));
}
@Test
public void whenFindByPublicationTimeBetween_thenArticles2And3Returned() {
List result = repository.findAllByPublicationTimeBetween(
new SimpleDateFormat("HH:mm").parse("15:15"),
new SimpleDateFormat("HH:mm").parse("16:30"));
assertEquals(2, result.size());
assertTrue(result.stream()
.map(Article::getId)
.allMatch(id -> Arrays.asList(2, 3).contains(id)));
}
@Test
public void givenArticlesWhenFindWithCreationDateThenArticles2And3Returned() {
List result = repository.findAllWithCreationDateTimeBefore(
new SimpleDateFormat("yyyy-MM-dd HH:mm").parse("2017-12-15 10:00"));
assertEquals(2, result.size());
assertTrue(result.stream()
.map(Article::getId)
.allMatch(id -> Arrays.asList(2, 3).contains(id));
}
}
Bei jedem Test wird überprüft, ob nur die Artikel abgerufen werden, die den Bedingungen entsprechen.
4. Fazit
In diesem kurzen Artikel haben wir gesehen, wie Entitäten mithilfe ihrer Datums- und Uhrzeitfelder mit Spring Data JPA abgefragt werden.
Wir haben ein bisschen Theorie gelernt, bevor wir Spring Data-Mechanismen zum Abfragen der Entitäten verwendeten. Wir haben gesehen, dass diese Mechanismen mit Datum und Uhrzeit genauso funktionieren wie mit anderen Datentypen.
Der Quellcode für diesen Artikel istover on GitHub verfügbar.