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é meno | Priezvisko | Číslo sedadla |
---|---|---|
Jill | Smith | 50 |
Eva | Jackson | 94 |
Fred | Bloggs | 22 |
Ricki | Bobbie | 36 |
Siya | Kolisi | 85 |
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.