Begrænsning af forespørgselsresultater med JPA og Spring Data JPA

1. Introduktion

I denne vejledning skal vi lære om at begrænse forespørgselsresultater med JPA og Spring Data JPA.

Først kigger vi på den tabel, vi vil forespørge om, samt den SQL-forespørgsel, vi vil gengive.

Så dykker vi lige ind i, hvordan man opnår det med JPA og Spring Data JPA.

Lad os komme igang!

2. Testdataene

Nedenfor har vi den tabel, som vi vil spørge igennem denne artikel.

Spørgsmålet, vi vil besvare, er: "Hvad er det første besatte sæde, og hvem besætter det?".

FornavnEfternavnSæde nummer
JillSmith50
EvaJackson94
FredBloggs22
RickiBobbie36
SiyaKolisi85

3. SQL

Med SQL skriver vi muligvis en forespørgsel, der ser sådan ud:

VÆLG fornavn, efternavn, sæde nummer FRA passagerER BESTIL EFTER sæde nummer GRÆNSE 1;

4. JPA-opsætning

Med JPA har vi først brug for en enhed for at kortlægge vores tabel:

@Entity-klasse Passager {@Id @GeneratedValue @Column (nullable = false) privat Lang id; @Basic (valgfri = falsk) @Column (nullable = false) privat String fistName; @Basic (optional = false) @Column (nullable = false) private String efternavn; @Basic (valgfri = falsk) @Column (nullable = false) private int seatNumber; // konstruktør, getters osv.}

Dernæst har vi brug for en metode, der indkapsler vores forespørgselskode, implementeret her som PassengerRepositoryImpl # findOrderedBySeatNumberLimitedTo (int limit):

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

I vores arkivmetode bruger vi EntityManager at oprette en Forespørgsel som vi kalder setMaxResults () metode.

Dette kald til Forespørgsel # setMaxResults vil i sidste ende resultere i grænsesætningen, der er tilføjet til den genererede SQL:

vælge passager0_.id som id1_15_, passager0_.fist_name som fist_nam2_15_, passager0_.last_name som sidste_nam3_15_, passager0_.sæde_nummer som sæde_nummer4_15_ fra passagerpassager0_ rækkefølge efter passager0_.sæde_nummergrænse?

5. Med Spring Data JPA

Vi kan også generere vores SQL ved hjælp af Spring Data JPA.

5.1. først eller top

En måde, hvorpå vi kunne nærme os dette, er ved at bruge metodenavledning med nøgleordene først eller top.

Vi kan eventuelt angive et nummer som den maksimale resultatstørrelse, der returneres. Hvis vi udelader det, antager Spring Data JPA en resultatstørrelse på 1.

Når vi husker, at vi vil vide, hvad der er det første besatte sæde, og hvem der besætter det, kan vi få det til at udelade nummeret på disse to måder:

Passager findFirstByOrderBySeatNumberAsc (); Passager findTopByOrderBySeatNumberAsc ();

Hvis vi begrænser til et eksempel på et eksempel, som ovenfor, kan vi også pakke resultatet ved hjælp af Valgfri:

Valgfri findFirstByOrderBySeatNumberAsc (); Valgfri findTopByOrderBySeatNumberAsc ();

5.2. Sidelig

Alternativt kan vi bruge en Sidelig objekt:

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

Hvis vi ser på standardimplementeringen af JpaRepository, det SimpleJpaRepository, vi kan se, at det også kalder Forespørgsel # setMaxResults:

beskyttet side readPage (TypedQuery-forespørgsel, Class domainClass, Pageable pageable, @Nullable Specification spec) {if (pageable.isPaged ()) {query.setFirstResult ((int) pageable.getOffset ()); query.setMaxResults (pageable.getPageSize ()); } returner PageableExecutionUtils.getPage (query.getResultList (), pageable, () -> {return executeCountQuery (this.getCountQuery (spec, domainClass));}); }

5.3. Sammenligning

Begge disse alternativer producerer den SQL, som vi søger:

vælg passager0_.id som id1_15_, passager0_.fist_name som knytnæve_152, passager0_.last_navn som sidste_nam3_15_, passager0_.sæde_nummer som sæde_nummer4_15_ fra passagerpassager0_ rækkefølge efter passager0_.sæde_nummer asc grænse?

Med først og top favoriserer konvention og Sidelig favoriserer konfiguration.

6. Konklusion

Begrænsning af forespørgselsresultater i JPA er lidt anderledes end SQL - vi inkluderer ikke grænsesøgeordet direkte i vores JPQL.

I stedet foretager vi bare et enkelt metodeopkald til Forespørgsel # maxResults eller inkluder nøgleordet først eller top i vores Spring Data JPA-metodenavn.

Som altid kan du finde koden over på GitHub.


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