Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

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 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