A lekérdezési eredmények korlátozása a JPA és a Spring Data JPA segítségével
1. Bemutatkozás
Ebben az oktatóanyagban fogunk megismerheti a lekérdezési eredmények korlátozását a JPA-val és a Spring Data JPA-val.
Először megnézzük a lekérdezni kívánt táblázatot, valamint a reprodukálni kívánt SQL-lekérdezést.
Aztán rögtön elmélyülünk abban, hogyan lehet ezt elérni a JPA és a Spring Data JPA segítségével.
Kezdjük el!
2. A tesztadatok
Az alábbiakban található a táblázat, amelyet az egész cikkben lekérdezünk.
A kérdés, amire válaszolni akarunk, a következő: „Mi az első elfoglalt hely és ki foglalja el?”.
Keresztnév | Vezetéknév | Ülésszám |
---|---|---|
Jill | Kovács | 50 |
Éva | Jackson | 94 |
Fred | Bloggs | 22 |
Ricki | Bobbie | 36 |
Siya | Kolisi | 85 |
3. Az SQL
SQL-rel írhatunk egy lekérdezést, amely így néz ki:
SELECT firstName, lastName, seatNumber FROM utasoktól SORRENDELÉS seatNumber LIMIT 1;
4. A JPA beállítása
A JPA-nál először egy entitásra van szükségünk, hogy feltérképezzük a táblázatunkat:
@Entity class Passenger {@Id @GeneratedValue @Column (nullable = false) private Long id; @Basic (opcionális = hamis) @Column (nullable = hamis) privát karakterlánc fistName; @Basic (opcionális = hamis) @Column (nullable = hamis) privát karakterlánc vezetéknév; @Basic (opcionális = hamis) @Column (nullable = hamis) private int seatNumber; // kivitelező, szerelők stb.}
Ezután szükségünk van egy olyan módszerre, amely összefoglalja a lekérdezési kódot, amelyet itt implementálunk PassengerRepositoryImpl # findOrderedBySeatNumberLimitedTo (int limit):
@Repository osztály PassengerRepositoryImpl {@PersistenceContext private EntityManager entitásManager; @ Nyilvános lista felülbírálása findOrderedBySeatNumberLimitedTo (int limit) {return entitásManager.createQuery ("KIVÁLASZTÁS P SZÁLLÍTÓBÓL p RENDELÉS p.seatNumber", Utas.osztály) .setMaxResults (korlát) .getResultList (); }}
Adattár módszerünkben a EntityManager létrehozni a Lekérdezés amelyre hívjuk a setMaxResults () módszer.
Ez a hívás # SetMaxResults lekérdezés végül azt eredményezi, hogy a létrehozott SQL-hez csatolt limit utasítás lesz:
válassza az utas0_.id mint id1_15_, utasa0_.ököl_neve: ököl_neve2_15_, utasa0_.neve_neve utolso_név3_15_, utas0_.hely_száma címet_szám4_15_ az utas utastól0_ utas utas szerint0_.hely_szám korlát?
5. A Spring Data JPA-val
Az SQL-t a Spring Data JPA segítségével is előállíthatjuk.
5.1. első vagy tetejére
Ennek egyik módja az volt, hogy a módszer neve levezetését használtuk a kulcsszavakkal első vagy tetejére.
Opcionálisan megadhatunk egy számot is a maximálisan visszaadandó eredményméretként. Ha ezt kihagyjuk, a Spring Data JPA 1-es eredményméretet feltételez.
Emlékeztetve arra, hogy tudni akarjuk, mi az első elfoglalt hely és ki foglalja el, megkaphatjuk a szám elhagyásával a következő két módon:
UtaskeresőFirstByOrderBySeatNumberAsc (); UtaskeresőTopByOrderBySeatNumberAsc ();
Ha egy példány eredményére korlátozódunk, mint fent, akkor az eredményt is felhasználhatjuk Választható:
Opcionális findFirstByOrderBySeatNumberAsc (); Opcionális findTopByOrderBySeatNumberAsc ();
5.2. Lapozható
Alternatív megoldásként használhatjuk a Lapozható tárgy:
Oldaloldal = repository.findAll (PageRequest.of (0, 1, Sort.by (Sort.Direction.ASC, "seatNumber")));
Ha megnézzük a JpaRepository, a SimpleJpaRepository, láthatjuk, hogy hív is # SetMaxResults lekérdezés:
védett oldal readPage (TypedQuery lekérdezés, Class domainClass, lapozható lapozható, @Nullable Specification specifikáció) {if (pageable.isPaged ()) {query.setFirstResult ((int) pageable.getOffset ()); query.setMaxResults (pageable.getPageSize ()); } return PageableExecutionUtils.getPage (query.getResultList (), lapozható, () -> {return executeCountQuery (this.getCountQuery (spec, domainClass);}); }
5.3. Összehasonlítás
Mindkét alternatíva előállítja azt az SQL-t, amelyre mi vagyunk:
válassza az utas0_.id mint id1_15_, utasa0_.ököl_neve ököl_neve2_15_, utasa0_. utolso_neve utolso_nev3_15_, utasa0_.szek_száma hely_száma4_15_ értéket az utas utastól0_ utas utas szerint0_.hely_szám emelkedési korlát?
Val vel első és tetejére az egyezmény támogatása és Lapozható előnyben részesíti a konfigurációt.
6. Következtetés
A lekérdezési eredmények korlátozása a JPA-ban kissé eltér az SQL-től - a limit kulcsszót nem vesszük fel közvetlenül a JPQL-be.
Ehelyett csak egyetlen módszert hívunk # MaxResults lekérdezés vagy tartalmazza a kulcsszót első vagy tetejére a Spring Data JPA módszer nevünkben.
Mint mindig, a kódot a GitHubon találja meg.