Ograničavanje rezultata upita pomoću JPA i Spring Data JPA

1. Uvod

U ovom uputstvu idemo saznajte više o ograničavanju rezultata upita s JPA i Spring Data JPA.

Prvo ćemo pogledati tablicu koju želimo postaviti kao i SQL upit koji želimo reproducirati.

Zatim ćemo zaroniti kako to postići pomoću JPA i Spring Data JPA.

Započnimo!

2. Podaci o ispitivanju

Ispod imamo tablicu koju ćemo postavljati upite u ovom članku.

Pitanje na koje želimo odgovoriti je: "Koje je prvo zauzeto mjesto i tko ga zauzima?".

ImePrezimeBroj sjedala
JillSmith50
PredvečerjeJackson94
FredBloggovi22
RickiBobbie36
SiyaKolisi85

3. SQL

S SQL-om bismo mogli napisati upit koji izgleda otprilike ovako:

ODABIRI firstName, lastName, seatNumber OD putnika REDOSLIJED BROJ sjedala LIMIT 1;

4. Postavljanje JPA

S JPA-om prvo trebamo entitet za mapiranje naše tablice:

@Entity class Putnik {@Id @GeneratedValue @Column (nullable = false) private Long id; @Basic (neobavezno = false) @Column (nullable = false) private String fistName; @Basic (nije obavezno = netačno) @Column (nullable = false) private String lastName; @Basic (neobavezno = false) @Column (nullable = false) private int seatNumber; // konstruktor, getteri itd.}

Dalje trebamo metodu koja obuhvaća naš kod upita, ovdje implementiranu kao PassengerRepositoryImpl # findOrderedBySeatNumberLimitedTo (int limit):

@Repository class PassengerRepositoryImpl {@PersistenceContext private EntityManager entityManager; @Override javni popis findOrderedBySeatNumberLimitedTo (int limit) {return entityManager.createQuery ("SELECT p FROM Passenger p ORDER BY p.seatNumber", Passenger.class) .setMaxResults (limit) .getResultList (); }}

U našoj metodi spremišta koristimo EntityManager stvoriti a Upit na kojoj nazivamo setMaxResults () metoda.

Ovaj poziv na Upit # setMaxResults na kraju će rezultirati naredbom ograničenja dodanom generiranom SQL-u:

odaberite putnik0_.id kao id1_15_, putnik0_.fist_name kao fist_nam2_15_, putnik0_.prizadnje ime kao last_nam3_15_, putnik0_.broj sjedala kao sjedalo_broj4_15_ od putničkog putnika0_ narudžba prema putniku0_.seat_number limit?

5. S Spring Data JPA

Naš SQL također možemo generirati pomoću Spring Data JPA.

5.1. prvi ili vrh

Jedan od načina na koji bismo tome mogli pristupiti jest korištenje izvoda naziva metode s ključnim riječima prvi ili vrh.

Po želji možemo odrediti broj kao maksimalnu veličinu rezultata koji će se vratiti. Ako ga izostavimo, Spring Data JPA pretpostavlja rezultat veličine 1.

Sjećajući se da želimo znati koje je prvo zauzeto mjesto i tko ga zauzima, možemo izostaviti broj na ova dva načina:

Putnik findFirstByOrderBySeatNumberAsc (); Putnik findTopByOrderBySeatNumberAsc ();

Ako se ograničimo na jedan rezultat instance, kao što je gore navedeno, tada također možemo umotati rezultat pomoću Neobvezno:

Neobvezno findFirstByOrderBySeatNumberAsc (); Neobvezno findTopByOrderBySeatNumberAsc ();

5.2. Pageable

Alternativno, možemo koristiti a Pageable objekt:

Stranica stranice = repository.findAll (PageRequest.of (0, 1, Sort.by (Sort.Direction.ASC, "seatNumber")));

Ako pogledamo zadanu implementaciju JpaRepository, the SimpleJpaRepository, možemo vidjeti da i to zove Upit # setMaxResults:

zaštićena stranica readPage (TypedQuery upit, Class domainClass, Pageable pageable, @Nullable Specification specifikacija) {if (pageable.isPaged ()) {query.setFirstResult ((int) pageable.getOffset ()); query.setMaxResults (pageable.getPageSize ()); } return PageableExecutionUtils.getPage (query.getResultList (), pageable, () -> {return executeCountQuery (this.getCountQuery (spec, domainClass));}); }

5.3. Usporedba

Obje ove alternative proizvest će SQL za kojim tragamo:

odabrati putnik0_.id kao id1_15_, putnik0_.fist_name kao fist_nam2_15_, putnik0_.prizadnje ime kao last_nam3_15_, putnik0_.broj sjedala kao sjedalo_broj4_15_ od putničkog putnika0_ narudžba prema limitu putnika0_.seat_numc asc?

S prvi i vrh favorizirajući konvenciju i Pageable favoriziranje konfiguracije.

6. Zaključak

Rezultati ograničavanja upita u JPA malo se razlikuju od SQL-a - ne uključujemo ograničenu ključnu riječ izravno u naš JPQL.

Umjesto toga, upućujemo samo jedan metodski poziv Upit # maxResults ili uključite ključnu riječ prvi ili vrh u našem nazivu Spring Data JPA metode.

Kao i uvijek, kod možete pronaći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found