Lekérdező entitások dátum és idő szerint a Spring Data JPA-val

1. Bemutatkozás

Ebben a gyors bemutatóban megtudhatjuk, hogyan lehet lekérdezni az entitásokat dátum szerint a Spring Data JPA segítségével.

Először frissítjük memóriánkat arról, hogyan lehet a dátumokat és időpontokat a JPA segítségével feltérképezni.

Ezután létrehozunk egy dátum- és időmezővel rendelkező entitást, valamint egy Spring Data-adattárat az entitások lekérdezéséhez.

2. Dátumok és idők feltérképezése a JPA-val

Kezdőknek, áttekintünk egy kis elméletet a dátumoknak a JPA-val történő feltérképezéséről. Azt kell tudni, hogy el kell döntenünk, hogy képviselni akarjuk-e:

  • Csak egy dátum
  • Csak egy idő
  • Vagy mindkettő

A (nem kötelező) @Oszlop megjegyzés, hozzá kell adnunk a @Időbeli annotáció annak megadásához, hogy mit jelent a mező.

Ez a megjegyzés olyan paramétert vesz fel, amelynek értéke TemporalType enum:

  • TemporalType.DATE
  • TemporalType.TIME
  • TemporalType.TIMESTAMP

Részletes cikk a dátumokkal és az időkkel kapcsolatos képekkel a JPA-val kapcsolatban itt található.

3. A gyakorlatban

A gyakorlatban, miután az entitásaink helyesen vannak beállítva, nem kell sokat dolgozni, hogy lekérdezzük őket a Spring Data JPA segítségével. Csak használnunk kell lekérdezési módszerek, @Query annotáció.

Minden tavaszi Data JPA mechanizmus rendben működik.

Nézzünk meg néhány példát a Spring Data JPA-val dátum és idő szerint lekérdezett entitásokról.

3.1. Entitás beállítása

Kezdetnek tegyük fel, hogy van egy Cikk entitás, közzétételi dátummal, közzétételi idővel, létrehozási dátummal és idővel:

@Entity public class Article {@Id @GeneratedValue Integer id; @Temporal (TemporalType.DATE) közzététel dátuma; @Temporal (TemporalType.TIME) Dátum közzétételi idő; @Temporal (TemporalType.TIMESTAMP) Dátum létrehozásaDateTime; }

A bemutatás dátumát és idejét két területre osztottuk a bemutató célból. Így a három időbeli típus képviselteti magát.

3.2. Az entitások lekérdezése

Most, hogy entitásunk fel van állítva, hozzunk létre egy Spring Data-t adattár hogy megkérdezzem azokat a cikkeket.

Három módszert hozunk létre, a Spring Data JPA számos funkciójának felhasználásával:

nyilvános felület ArticleRepository kiterjeszti a JpaRepository {List findAllByPublicationDate (Date publishingDate); List findAllByPublicationTimeBetween (Dátum közzétételTimeStart, Dátum közzétételTimeEnd); @Query ("válasszon ki egy a cikkből, ahol a.creationDateTime <=: creationDateTime") List findAllWithCreationDateTimeBefore (@Param ("creationDateTime") Date creationDateTime); }

Tehát három módszert definiáltunk:

  • findAllByPublicationDate amely beolvassa az adott napon megjelent cikkeket
  • findAllByPublicationTimeBetween amely két adott óra között megjelent cikkeket tölti le
  • és findAllWithCreationDateTimeBefore amely egy adott dátum és időpont előtt készített cikkeket tölti le

A két első módszer a Spring Data-ra támaszkodik lekérdezési módszerek mechanizmus és utoljára @Lekérdezés annotáció.

Végül ez nem változtatja meg a dátumok kezelésének módját. Az első módszer csak a paraméter dátum részét veszi figyelembe.

A második csak a paraméterek idejét veszi figyelembe. És az utolsó mind a dátumot, mind az időt használja.

3.3. Tesztelje a lekérdezéseket

Az utolsó dolog, amit tennünk kell, hogy néhány tesztet fel kell állítanunk annak ellenőrzésére, hogy ezek a lekérdezések a várt módon működnek-e.

Először importálunk néhány adatot az adatbázisunkba, majd létrehozzuk a tesztosztályt, amely ellenőrzi a tárház egyes módszereit:

@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, eredmény.méret ()); assertTrue (result.stream () .map (cikk :: 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 ("HHse: mm". 30 ")); assertEquals (2, eredmény.méret ()); assertTrue (result.stream () .map (cikk :: 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, eredmény.méret ()); assertTrue (result.stream () .map (cikk :: getId) .allMatch (id -> Arrays.asList (2, 3) .contains (id));}}

Minden teszt ellenőrzi, hogy csak a feltételeknek megfelelő cikkek kerültek-e letöltésre.

4. Következtetés

Ebben a rövid cikkben azt láthattuk, hogyan lehet lekérdezni az entitásokat a dátum és az idő mezők felhasználásával a Spring Data JPA segítségével.

Megtanultunk egy kis elméletet, mielőtt Spring Data mechanizmusokat használtunk volna az entitások lekérdezéséhez. Láttuk, hogy ezek a mechanizmusok ugyanúgy működnek a dátumokkal és időpontokkal, mint más típusú adatokkal.

A cikk forráskódja elérhető a GitHub oldalon.