Java Persistence Query Language
A Java Persistence Query Language (JPQL) egy platformfüggetlen objektumorientált lekérdező nyelv amelyet a Java Persistence API specifikál.
A JPQL használatával entitásokat tároló relációs adatbázison végezhetünk műveleteket. Szintaktikáját tekintve nagyon hasonlít az SQL-re, de a lekérdezésekben táblák és attribútumok helyett osztályokra és azok property-jeire hivatkozunk. A JPQL lekérdezések nem közvetlenül az adatbázisnak szólnak, az ORM technika segítségével lesznek belőlük valódi SQL lekérdezések.
Az objektumok lekérdezése mellett (SELECT
utasítás), a JPQL támogatja a csoportos UPDATE
és DELETE
utasításokat is.
Példák
[szerkesztés]Tegyük fel, hogy a következő entitásokat megvalósító osztályaink vannak (a getter és setter metódusokat elhagytuk az egyszerűség kedvéért):
@Entity
public class Szerzo {
@Id
private Integer azonosito;
private String vezetekNev;
private String keresztNev;
@ManyToMany
private List<Konyv> konyvek;
}
@Entity
public class Konyv {
@Id
private Integer azonosito;
private String cim;
private String isbn;
@ManyToOne
private Kiado kiado;
@ManyToMany
private List<Szerzo> szerzok;
}
@Entity
public class Kiado {
@Id
private Integer id;
private String nev;
private String cim;
@OneToMany(mappedBy = "kiado")
private List<Konyv> konyvek;
}
Ekkor a következő lekérdezés segítségével kaphatjuk meg az összes szerzőt ábécé sorrendben:
SELECT a FROM Szerzo a ORDER BY a.vezetekNev, a.keresztNev
Azon szerzők listájához akiknek jelent meg művük az XYZ Kiadónál a következő lekérdezést kell végrehajtanunk:
SELECT DISTINCT a FROM Szerzo a INNER JOIN a.konyvek b WHERE b.kiado.nev = 'XYZ Kiado'
A JPQL támogatja a dinamikus paramétereket amelyek kettősponttal kezdődnek (:
). Így például írhatunk egy metódust, amely a paraméterként kapott keresztnévvel rendelkező szerzőket kéri le az adatbázisból:
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.commons.lang.StringUtils;
...
@SuppressWarnings("unchecked")
public List<Author> getAuthorsByLastName(String kerNev) {
String queryString = "SELECT a FROM Szerzo a " +
"WHERE :keresztNevParam IS NULL OR LOWER(a.keresztNev) = :keresztNevParam";
Query query = getEntityManager().createQuery(queryString);
query.setParameter("keresztNevParam", StringUtils.lowerCase(kerNev));
return query.getResultList();
}
Hibernate Query Language
[szerkesztés]A JPQL alapja a Hibernate Query Language (HQL), amely egy korábbi nem-szabványos lekérdező nyelv a Hibernate programkönyvtárból.
A Hibernate és a HQL korábbi mint a JPA, az csak egy részhalmazát specifikálja a HQL-nek.