Obmedzenie výsledkov dotazov pomocou JPA a jarných údajov JPA

1. Úvod

V tejto príručke sa chystáme dozviete sa viac o obmedzení výsledkov dotazov s JPA a Spring Data JPA.

Najskôr sa pozrieme na tabuľku, ktorú chceme dotazovať, a tiež na dotaz SQL, ktorý chceme reprodukovať.

Potom sa ponoríme priamo do toho, ako to dosiahnuť pomocou JPA a Spring Data JPA.

Začnime!

2. Skúšobné údaje

Ďalej uvádzame tabuľku, na ktorú sa v tomto článku pýtame.

Otázka, na ktorú chceme odpovedať, je: „Aké je prvé obsadené miesto a kto ho obsadzuje?“.

Krstné menoPriezviskoČíslo sedadla
JillSmith50
EvaJackson94
FredBloggs22
RickiBobbie36
SiyaKolisi85

3. SQL

Pomocou jazyka SQL môžeme napísať dotaz, ktorý vyzerá asi takto:

VYBERTE krstné meno, priezvisko, seatNumber FROM cestujúcich OBJEDNÁVKA NA seatNumber LIMIT 1;

4. Nastavenie JPA

Pri JPA potrebujeme najskôr entitu, aby sme zmapovali našu tabuľku:

@Entity class Passenger {@Id @GeneratedValue @Column (nullable = false) private Long id; @Basic (voliteľné = false) @Column (nullable = false) súkromný reťazec fistName; @Basic (voliteľné = false) @Column (nullable = false) súkromný reťazec priezvisko; @Basic (voliteľné = false) @Column (nullable = false) private int seatNumber; // konštruktor, getri atď.}

Ďalej potrebujeme metódu, ktorá zapuzdruje náš kód dotazu, implementovanú tu ako PassengerRepositoryImpl # findOrderedBySeatNumberLimitedTo (int limit):

@Repository class 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 (); }}

V našej metóde úložiska používame EntityManager vytvoriť Dopyt na ktorom hovoríme setMaxResults () metóda.

Táto výzva Dotaz # setMaxResults nakoniec vyústi do limitu pripojeného k vygenerovanému SQL:

vyberte z ponuky cestujúci_0_.id ako id1_15_, meno_cestujúceho0_.fist_name ako fist_nam2_15_, meno_cestujúceho0_.last_name ako last_nam3_15_, číslo_cestujúceho0_.seat_mesto_miesto_miesto_sedadlo__4_15_z osobného cestujúcich_0_objednať podľa počtu cestujúcich0_.seat_number?

5. S jarnými údajmi JPA

Náš SQL môžeme vygenerovať aj pomocou Spring Data JPA.

5.1. najprv alebo hore

Jedným zo spôsobov, ako by sme to mohli priblížiť, je použitie odvodenia názvu metódy od kľúčových slov najprv alebo hore.

Voliteľne môžeme určiť číslo ako maximálnu veľkosť výsledku, ktorá sa vráti. Ak to vynecháme, Spring Data JPA predpokladá veľkosť výsledku 1.

Pamätajúc na to, že chceme vedieť, čo je prvé obsadené miesto a kto ho obsadzuje, môžeme ho vynechať dvoma spôsobmi:

Pasažier findFirstByOrderBySeatNumberAsc (); Pasažier findTopByOrderBySeatNumberAsc ();

Ak obmedzíme výsledok na jednu inštanciu, ako je uvedené vyššie, potom môžeme výsledok zabaliť aj pomocou príkazu Voliteľné:

Voliteľné findFirstByOrderBySeatNumberAsc (); Voliteľné findTopByOrderBySeatNumberAsc ();

5.2. Stránkovateľné

Prípadne môžeme použiť a Stránkovateľné objekt:

Stránka page = repository.findAll (PageRequest.of (0, 1, Sort.by (Sort.Direction.ASC, "seatNumber")));

Ak sa pozrieme na predvolenú implementáciu JpaRepository, the SimpleJpaRepository, vidíme, že aj volá Dotaz # setMaxResults:

chránená stránka readPage (dopyt TypedQuery, trieda domainClass, stránkovateľné stránkovateľné, @ špecifikácia špecifikácie @Nullable) {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. Porovnanie

Obe tieto alternatívy vyprodukujú SQL, ktoré sledujeme:

vyberte z ponuky cestujúci_0_.id ako id1_15_, meno_cestujúceho0_.fist_name ako fist_nam2_15_, meno_cestujúceho0_.last_name ako last_nam3_15_, číslo_cestujúceho0_.seat_mesto_miesto_miesto_miesto__4_15_ zo zoznamu cestujúcich_0_seznam podľa čísla cestujúcich0_.seat_number?

S najprv a hore uprednostňujúci dohovor a Stránkovateľné uprednostňovanie konfigurácie.

6. Záver

Obmedzenie výsledkov dotazov v JPA sa trochu líši od SQL - kľúčové slovo limit nezahŕňame priamo do nášho JPQL.

Namiesto toho zavoláme iba jednu metódu Dopyt # maxResults alebo zahrňte kľúčové slovo najprv alebo hore v našom názve metódy Spring Data JPA.

Ako vždy, kód nájdete na GitHub.


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