A JPA-lekérdezések típusai

1. Áttekintés

Ebben az oktatóanyagban megvitatjuk a JPA-lekérdezések különböző típusait. Sőt, arra fogunk összpontosítani, hogy összehasonlítsuk a köztük lévő különbségeket, és kibővítsük mindenki előnyeit és hátrányait.

2. Beállítás

Először határozzuk meg a UserEntity osztály, amelyet a cikk összes példájához használunk:

@Table (name = "users") @Entity public class UserEntity {@Id private Long id; privát karakterlánc neve; // Normál kivitelező, mérőeszközök és beállítók. }

A JPA-lekérdezéseknek három alapvető típusa van:

  • Lekérdezés, a Java Persistence Query Language (JPQL) szintaxissal írva
  • NativeQuery, egyszerű SQL szintaxissal írva
  • Criteria API lekérdezés, programozottan, különböző módszerekkel konstruálva

Fedezzük fel őket.

3. Lekérdezés

A Lekérdezés szintaxisában hasonló az SQL-hez, és általában CRUD műveletek végrehajtására használják:

public UserEntity getUserByIdWithPlainQuery (Long id) {Query jpqlQuery = getEntityManager (). createQuery ("SELECT u FROM UserEntity u WHERE u.id =: id"); jpqlQuery.setParameter ("id", id); return (UserEntity) jpqlQuery.getSingleResult (); }

Ez Lekérdezés lekéri a megfelelő rekordot a felhasználók táblázatot, és a UserEntity tárgy.

Két további van Lekérdezés altípusok:

  • TypedQuery
  • NamedQuery

Lássuk őket működés közben.

3.1. TypedQuery

Figyelnünk kell a Visszatérés nyilatkozat az előző példánkban. A JPA nem tudja levezetni, hogy mi a Lekérdezés eredmény típusa lesz, és ennek eredményeként nekünk kell leadnunk.

De, A JPA különlegességet biztosít Lekérdezés altípus néven ismert TypedQuery.Ezt mindig előnyben részesítjük, ha ismerjük a sajátunkat Lekérdezés eredménytípust előzetesen. Ezenkívül sokkal megbízhatóbbá és könnyebben tesztelhetővé teszi kódunkat.

Lássuk a TypedQuery az első példánkhoz képest:

public UserEntity getUserByIdWithTypedQuery (Long id) {TypedQuery typedQuery = getEntityManager (). createQuery ("SELECT u FROM UserEntity u WHERE u.id =: id", UserEntity.class); typedQuery.setParameter ("id", id); return typedQuery.getSingleResult (); }

Ily módon, erősebb gépelést kapunk ingyen, elkerülve az esetleges öntési kivételeket az úton.

3.2. NamedQuery

Miközben dinamikusan definiálhatjuk a Lekérdezés meghatározott módszerek alapján végül nehezen karbantartható kódbázissá nőhetnek. Mi lenne, ha az általános használati kérdéseket egy központosított, könnyen olvasható helyen tartanánk?

A JPA is rávesz minket erről egy másikkal Lekérdezés altípus néven ismert NamedQuery.

Meghatározzuk NamedQuery a Entitás osztály maga, amely központosított, gyors és egyszerű módot kínál az olvasáshoz és a megtaláláshoz EntitásKapcsolódó lekérdezései.

Minden NamedQueries egyedi névvel kell rendelkeznie.

Lássuk, hogyan adhatunk hozzá egy NamedQuery a miénknek UserEntity osztály:

@Table (name = "users") @Entity @NamedQuery (name = "UserEntity.findByUserId", query = "SELECT u FROM UserEntity u WHERE u.id =: userId") public class UserEntity {@Id private Long id; privát karakterlánc neve; // Normál kivitelező, mérőeszközök és beállítók. }

A @NévQuery az annotációt a a csoportba kell csoportosítani @NévQueries megjegyzés, ha a Java-t a 8. verzió előtt használjuk. A Java 8-tól kezdve egyszerűen megismételhetjük a @NévQuery annotáció nálunk Entitás osztály.

Használva NamedQuery nagyon egyszerű:

public UserEntity getUserByIdWithNamedQuery (Long id) {Query namedQuery = getEntityManager (). createNamedQuery ("UserEntity.findByUserId"); namedQuery.setParameter ("userId", id); return (UserEntity) namedQuery.getSingleResult (); }

4. NativeQuery

A NativeQuery egyszerűen SQL lekérdezés. Ez lehetővé teszi számunkra, hogy felszabadítsuk adatbázisunk teljes erejét, mivel használhatunk olyan saját fejlesztésű szolgáltatásokat, amelyek nem állnak rendelkezésre JPQL-korlátozott szintaxisban.

Ennek költsége van. A (z) alkalmazással elveszítjük alkalmazásunk adatbázis-hordozhatóságát NativeQuery mert a JPA szolgáltatónk már nem tud elvonatkoztatni az adatbázis-megvalósítás vagy a szállító konkrét részleteit.

Nézzük meg, hogyan kell használni a NativeQuery amely ugyanazokat az eredményeket adja, mint korábbi példáink:

public UserEntity getUserByIdWithNativeQuery (Long id) {Query nativeQuery = getEntityManager (). createNativeQuery ("SELECT * FROM users WHERE id =: userId", UserEntity.class); nativeQuery.setParameter ("userId", id); return (UserEntity) nativeQuery.getSingleResult (); }

Mindig figyelembe kell vennünk, ha a NativeQuery az egyetlen lehetőség. Legtöbbször jó JPQL Lekérdezés kielégítheti igényeinket, és ami a legfontosabb, fenntartja az absztrakció szintjét az adatbázis tényleges megvalósításától.

Használata NativeQuery nem feltétlenül jelenti azt, hogy bezárkózunk egy adott adatbázis-gyártóhoz. Végül is, ha lekérdezéseink nem használnak saját SQL parancsokat, és csak egy szabványos SQL szintaxist használnak, akkor a szolgáltatóváltás nem lehet kérdés.

5. Kritériumok API lekérdezés

Kritériumok Az API-lekérdezések programozottan felépített, típusbiztos lekérdezések - némileg hasonlóak a szintaxisban szereplő JPQL-lekérdezésekhez:

public UserEntity getUserByIdWithCriteriaQuery (Long id) {CriteriaBuilder criteriaBuilder = getEntityManager (). getCriteriaBuilder (); CriteriaQuery critiQuery = criterBuilder.createQuery (UserEntity.class); Root userRoot = feltételekQuery.from (UserEntity.class); UserEntity queryResult = getEntityManager (). CreateQuery (feltételekQuery.select (userRoot) .where (feltételekBuilder.equal (userRoot.get ("id"), id))) .getSingleResult (); return queryResult; }

Ijesztő lehet a használata Kritériumok API-lekérdezések első kézből, de remek választás lehet, ha dinamikus lekérdezési elemeket kell hozzáadnunk, vagy ha a JPA-val párosulunk Metamodell.

6. Következtetés

Ebben a rövid cikkben megtudtuk, hogy mik a JPA-lekérdezések, azok használatával együtt.

A JPA lekérdezések nagyszerű módja annak, hogy elvonjuk üzleti logikánkat az adatelérési rétegünktől, mivel támaszkodhatunk a JPQL szintaxisra, és hagyhatjuk, hogy a választott JPA szolgáltatónk kezelje a Lekérdezés fordítás.

A cikkben bemutatott összes kód elérhető a GitHubon.


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