Java Persistence Query Language

Z FI WIKI
Verze z 28. 4. 2013, 22:13; 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. Tento dopytový jazyk používa abstraktné schémy perzistencie entít(pričom zahŕňa 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ť pripravené príkazy, ktoré budú neskôr použíté na vkladanie, aktualizáciu alebo 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 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 adekvátne položky budú vyextrahované z databázy.

Tento kód 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