Begrensning av søkeresultater med JPA og Spring Data JPA

1. Introduksjon

I denne opplæringen skal vi lære om å begrense søkeresultatene med JPA og Spring Data JPA.

Først tar vi en titt på tabellen vi vil spørre så vel som SQL-spørringen vi vil gjengi.

Deretter dykker vi rett i hvordan vi kan oppnå det med JPA og Spring Data JPA.

La oss komme i gang!

2. Testdataene

Nedenfor har vi tabellen som vi vil spørre gjennom denne artikkelen.

Spørsmålet vi ønsker å svare på er: "Hva er det første okkuperte setet og hvem okkuperer det?".

FornavnEtternavnSetenummer
JillSmith50
EvaJackson94
FredBloggs22
RickiBobbie36
SiyaKolisi85

3. SQL

Med SQL kan vi skrive et spørsmål som ser slik ut:

VELG fornavn, etternavn, setenummer FRA passasjerER BESTIL MED Seternummer GRENSE 1;

4. JPA-oppsett

Med JPA trenger vi først en enhet for å kartlegge tabellen vår:

@Entity class Passenger {@Id @GeneratedValue @Column (nullable = false) private Lang id; @Basic (optional = false) @Column (nullable = false) private String fistName; @Basic (optional = false) @Column (nullable = false) private String etternavn; @Basic (valgfritt = false) @Column (nullable = false) private int seatNumber; // konstruktør, getters osv.}

Deretter trenger vi en metode som innkapsler spørringskoden vår, implementert her som PassengerRepositoryImpl # findOrderedBySeatNumberLimitedTo (int limit):

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

I vår depotmetode bruker vi EntityManager å lage en Spørsmål som vi kaller setMaxResults () metode.

Dette kallet til Spørring # setMaxResults vil til slutt resultere i grenseoppgaven som er lagt til den genererte SQL:

velg passasjer0_.id som id1_15_, passasjer0_fist_name som fist_nam2_15_, passasjer0_.last_name som siste_nam3_15_, passasjer0_.sete_nummer som sete_nummer4_15_ fra passasjerpassasjer0_ rekkefølge etter passasjer0_.seternummergrense?

5. Med vårdata JPA

Vi kan også generere vår SQL ved hjelp av Spring Data JPA.

5.1. først eller topp

En måte vi kunne nærme oss dette på er å bruke metodenavledelse med nøkkelordene først eller topp.

Vi kan eventuelt angi et tall som den maksimale resultatstørrelsen som skal returneres. Hvis vi utelater det, antar Spring Data JPA en resultatstørrelse på 1.

Når vi husker at vi vil vite hva som er det første okkuperte setet og hvem som okkuperer det, kan vi få det til å utelate nummeret på disse to måtene:

Passasjer findFirstByOrderBySeatNumberAsc (); Passasjer findTopByOrderBySeatNumberAsc ();

Hvis vi begrenser til ett forekomstresultat, som ovenfor, kan vi også pakke inn resultatet ved hjelp av Valgfri:

Valgfritt findFirstByOrderBySeatNumberAsc (); Valgfritt findTopByOrderBySeatNumberAsc ();

5.2. Sidelig

Alternativt kan vi bruke en Sidelig gjenstand:

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

Hvis vi tar en titt på standardimplementeringen av JpaRepository, de SimpleJpaRepository, vi kan se at det også kaller Spørring # setMaxResults:

beskyttet side readPage (TypedQuery-spørring, 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 alternativene vil produsere den SQL som vi er ute etter:

velg passasjer0_.id som id1_15_, passasjer0_fist_name som fist_nam2_15_, passasjer0_.last_name som siste_nam3_15_, passasjer0_.sete_nummer som sete_nummer4_15_ fra passasjerpassasjer0_ rekkefølge etter passasjer0_.sete_nummer stiggrense?

Med først og topp favoriserer konvensjon og Sidelig favoriserer konfigurasjon.

6. Konklusjon

Begrensning av søkeresultater i JPA er litt annerledes enn SQL - vi inkluderer ikke grenseordet direkte i JPQL-en.

I stedet lager vi bare en enkelt metoden Spørring # maxResults eller ta med nøkkelordet først eller topp i vår Spring Data JPA-metodenavn.

Som alltid kan du finne koden på GitHub.


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