Java Persistence Query Language

Z FI WIKI
Verze z 13. 5. 2013, 18:49; 374351@muni.cz (diskuse | příspěvky)

(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Přejít na: navigace, hledání
This page is also available in English: Java Persistence Query Language (English)

Prehľad

Java Persistence Query Language(skrátene JPQL) je dopytový jazyk, ktorý je používaný na vrstve perzistencie dát v enterprise aplikáciách na platforme Java EE. Je považovaný za objektovú verziu SQL. JPQL definuje dopyty(česky dotazy, anglicky queries) pre entity a ich perzistentné stavy[1]. Tento jazyk povoľuje vytvárať prenositeľné dopyty, ktoré fungujú nezávisle od úložiska dát pod nimi. Podmienkou je jedine použitie relačnej databázy. JPQL používa abstraktné schémy perzistencie entít(pričom zahŕňa aj ich vzťahy) pre svoj dátový model a definuje operátory a výrazy založené na tomto dátovom modeli. Je používaný napríklad v Java Persistence API, kde je možné vytvárať vopred pripravené tvrdenia(angl. statements), ktoré budú neskôr použíté na extrakciu dát z relačnej databázy.

Príklady

 
 @Transactional
    public List<Player> findAllPlayers() {
 
        Query query = em.createQuery("SELECT p FROM Player p");
        List<Player> list = query.getResultList();
        return list;
    }

V prvom príklade je použítý jednoduchý dopyt, ktorý nie je odlišný od SQL dopytu. Tento dopyt vyextrahuje z databázy všetkých hráčov a uloží ich do adekvátnej kolekcie.

 
 @Transactional
    public List<Player> findPlayerByFullName(String name, String surname) {
        if (name == null) {
            throw new IllegalArgumentException("Name is null.");
        } else if (surname == null) {
            throw new IllegalArgumentException("Surname is null.");
        } else {
 
            Query query = em.createQuery("SELECT p FROM Player p WHERE p.name = :name AND p.surname = :surname");
            query.setParameter("name", name);
            query.setParameter("surname", surname);
            List<Player> list = query.getResultList();
            return list;
        }
    }

V tomto zložitejšom príklade sú oproti prvému dva hlavné rozdiely. Prvým je, že táto metóda validuje parametre, či sú oba prítomné. Druhý rozdiel je priamo v dopyte. V tomto príklade sú použité takzvané pomenované parametre(:name a :surname), ktoré sú označené dvojbodkou. Tieto parametre je možné nastaviť priamo hodnotami pomocou volania funkcie setParameter(). Ich hodnota sa spropaguje do dopytu a vyhovujúce záznamy budú vyextrahované z databázy.

Výkonný kód extrakcie je možné "zelegantniť" na dva riadky reťazením volaní nasledovne:

 
 @Transactional
    public List<Player> findPlayerByFullName(String name, String surname) {
        if (name == null) {
            throw new IllegalArgumentException("Name is null.");
        } else if (surname == null) {
            throw new IllegalArgumentException("Surname is null.");
        } else {
 
            Query query = em.createQuery("SELECT p FROM Player p WHERE p.name = :name AND p.surname = :surname");
            List<Player> list = query.setParameter("name", name).query.setParameter("surname", surname).getResultList();
            return list;
        }
    }

Okrem notácie s dvojbodkou je možné použiť aj číselný parameter, ktorý používa namiesto dvojbodky otáznik:

 
Query query = em.createQuery("SELECT p FROM Player p WHERE p.name = ?1 AND p.surname = ?2");
            query.setParameter(1, name);
            query.setParameter(2, surname);

Pri jednoduchých dopytoch to nepredstavuje problém, ale pri tých zložitejších je lepšie použiť pomenované parametre, aby bola zachovaná prehľadnosť kódu.

Odkazy

[1] http://docs.oracle.com/javaee/6/tutorial/doc/bnbrg.html

[2] http://www.objectdb.com/java/jpa/query/parameter

[3] http://en.wikipedia.org/wiki/JPQL