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évVezetéknévÜlésszám
JillKovács50
ÉvaJackson94
FredBloggs22
RickiBobbie36
SiyaKolisi85

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.