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.