A JPA első kiadása nem tartalmazta a Hibernate felhasználói között népszerű Criteria lekérdezést, amely – kisebb változtatásokkal – része lett a JPA 2.0 specifikációnak. A CriteriaQuery nagyon jól használható olyan lekérdezésekhez, amelyeknél paraméterből jön a szűrni kívánt mező, vagy a rendezendő oszlop. Az egyetlen probléma a végrehajtott JPQL/SQL lekérdezése, amely két okból is jól jöhet:
- kinyerni egy jó és tömör JPQL lekérdezést, amely fedi a Criteria tömörségét
- hiba keresésénél kiírni a naplóba a végrehajtott JQPL vagy SQL utasítást
Van egy jó és egy rossz hírem: a jó hír az, hogy van erre lehetőség. a rossz hír pedig az, hogy JPA provider függő.
Criteria lekérdezés
Készítsünk egy átlagos Criteria lekérdezést:
Code Block |
---|
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Book> q = cb.createQuery(Book.class); Root<Book> b = q.from(Book.class); q.select(b).orderBy(cb.desc(b.get("id"))); TypedQuery<Book> findAllBooks = em.createQuery(q); |
JPQL/SQL utasítás lekérdezése
A fenti forráskód eredményeképp előáll egy TypedQuery, amelyből kiindulva le tudjuk kérdezni az JPA provider által előállított JPQL vagy SQL utasítást.
EclipseLink
EclipseLink esetén lehetőségünk van lekérdezni az SQL utasítást, ha már az adatbázisig eljuttattuk a kérést (különben null eredményt kapunk):
Code Block |
---|
findAllBooks.unwrap(org.eclipse.persistence.jpa.JpaQuery.class).getDatabaseQuery().getSQLString(); |
Hibernate
Hibernate esetén egy nem kell lekérdeznünk a DatabaseQuery példányt, a getQueryString azonnal visszaadja a kívánt SQL utasítást:
Code Block |
---|
findAllBooks.unwrap(org.hibernate.Query.class).getQueryString() |
OpenJPA
OpenJPA esetén is elég a getQueryString, viszont ez nem SQL, hanem JPQL utasítást ad vissza:
Code Block |
---|
findAllBooks.unwrap(org.apache.openjpa.persistence.QueryImpl.class).getQueryString() |
Mit hoz a jövő?
Mielőtt belemerülnénk a fenti megoldások használatába, nézzünk körül a JPA 2.1 háza táján, ugyanis a 2.1 már specifikálja a JPQL és az SQL utasítás lekérdezhetőségét a getJPQLString és a getSQLString használatával, amelyet az EclipseLink már többé-kevésbé támogat is.
(forrás: java.dzone.com/articles/how-get-jpqlsql-string)
Viewtracker |
---|