Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

J2EE: Bazy danych c.d. Język zapytań EJB QL.

Podobne prezentacje


Prezentacja na temat: "J2EE: Bazy danych c.d. Język zapytań EJB QL."— Zapis prezentacji:

1 J2EE: Bazy danych c.d. Język zapytań EJB QL

2 Język EJB QL Pozwala na bardziej zaawansowane wydobywanie danych z bazy niż find() Zapytanie tworzy się przez metodę: manager.createQuery() manager.createNativeQuery() manager.createNamedQuery() Powstający obiekt Query może zostać uruchomiony Najprostszy przykład: lista wszystkich samochodów manager.createQuery("from Samochod s").getResultList();

3 Język EJB QL Podstawa: klasa Query Pobieranie danych Ustawienia
getResultList() getSingleResult() executeUpdate() Ustawienia setFirstResult(int) setMaxResults(int) setParameter(name|position, value|date|calendar) setFlushMode(FlushModeType) setHint(String name, Object value)

4 Przykłady Cała tabela Jeden rekord
Query query = manager.createQuery("from Samochod s"); Collection samochody = (Collection)query.getResultList( ); Jeden rekord Query query = manager.createQuery( "from Samochod s where s.numer='XYZ 123'"); Samochod sam = (Samochod)query.getSingleResult( );

5 Ustawianie parametrów
Parametry wg nazwy Query query = manager.createQuery( "from Samochod s where s.numer=:numer"); query.setParameter("numer","XYZ 123"); Samochod sam = (Samochod)query.getResultList( ); Parametry wg pozycji "from Samochod s where s.numer=?1"); query.setParameter(1,"XYZ 123");

6 Parametry zagnieżdżone
// nazwa to kolumna z klasy Marka!!! public List findByName(String name){ Query query = manager.createQuery( "from Samochod s where marka.nazwa=:nazwa"); query.setParameter("nazwa", name); return query.getResultList(); }

7 Użycie dat query.setParameter(name, date, temporalType)
Trzeci parametr opisuje na jaki typ SQL mapować kolumnę TemporalType.DATE|TIME|TIMESTAMP Query query = manager.createQuery( "from Car c where c.year=:date"); query.setParameter("date", new Date(), TemporalType.DATE); Collection cars = query.getResultList( );

8 Stronicowanie rezultatów
setMaxResults(int limit) setFirstResult(int offset) List getAllCars(int limit, int offset) { Query query = manager.createQuery("from Samochod s"); return query .setMaxResults(limit) .setFirstResult(offset) .getResultList( ); }

9 Rozszerzanie zapytań Cały obiekt Tylko wybrane kolumny
select s from Samochod s Tylko wybrane kolumny select numer, rok from Samochod s Referencje do obiektów powiązanych select numer, marka.nazwa from Samochod s ale nie(!): select nazwa, samochod.numer from Marka m Złączenia select numer, nazwa from Samochod s join s.marka m

10 Czytanie wielu kolumn List result = manager.createQuery("select number, year from Samochod s").getResultList(); Iterator it = result.iterator(); while(it.hasNext()) { Object[ ] row = (Object[ ])it.next(); String number = (String)row[0]; Date year = (Date)row[1]; }

11 Tworzenie obiektów na rezultat
class CarInfo{ String no; Date pr_year; } ... List result = manager.createQuery("select new CarInfo(number, year) from Samochod s").getResultList(); Iterator it = result.iterator(); while(it.hasNext()) { CarInfo cin = (CarInfo)it.next(); System.out.println(cin.no+" "+cin.pr_year); * UWAGA! Należy dostarczyć odpowiednie konstruktory

12 Elementy jak w SQL INNER JOIN LEFT JOIN IS NULL BETWEEN, NOT BETWEEN
IN, NOT IN LIKE

13 Elementy specyficzne EJB QL
JOIN FETCH IS EMPTY MEMBER OF, NOT MEMBER OF

14 Funkcje Tekstowe: Matematyczne: ABS, SQRT, MOD
LOWER(txt) UPPER(txt) TRIM ([LEADING|TRAILING|BOTH] [sign] txt) CONCAT(txt1, txt2) LENGTH(txt1) LOCATE(txt1, txt2[, start]) SUBSTRING(txt1, start, len) Matematyczne: ABS, SQRT, MOD Datowe: CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP

15 Inne elementy SQL-like
Funkcje agregujące(min, max, sum, avg, count) Fraza DISTINCT Fraza ORDER BY (tylko dla kolumn listowanych) GROUP BY i HAVING Zagnieżdżanie zapytań w WHERE i HAVING ALL, ANY i EXISTS UPDATE i DELETE – dozwolone, ale nie zmieniają automatycznie encji podłączonych (bulk updates)

16 Inne możliwości Użycie klasycznego SQL Definiowanie "named queries"
objekt DataSource objekt NativeQuery Definiowanie "named queries" @NamedQuery("qname","select...") manager.createNamedQuery("qname")

17 Jak używać zapytań Mniej zapytań – szybsze działanie!
Przykład: jak dużo samochodów każdej marki List marki = manager.createQuery("from Marka m") .getResultList(); Iterator it = marki.iterator( ); while (it.hasNext( )) { Marka marka = (Marka)it.next( ); Query query = manager.createQuery( "from Samochod s where marka=:marka"); query.setParameter(„marka", marka); List ilsam = query.getResultList(); System.out.println(marka.getNazwa() + ": " + ilsam.size()); }

18 Przykład zapytania Popzednio: liczba zapytań = 1+ liczba typów
Rozwiązanie jednym zapytaniem: List marki = manager.createQuery( "select m.nazwa, m.typ, count(*) from Marka m"+ "JOIN m.samochody c GROUP BY m.nazwa, " + "m.typ").getResultList(); Iterator it = marki.iterator( ); while (it.hasNext( )) { Object[ ] row = (Object[ ])it.next(); String marka = (String)row[0] + (String)row[1]; Long il = (Long)row[2]; System.out.println(marka+": "+il); }

19 Przykłady/Ćwiczenia


Pobierz ppt "J2EE: Bazy danych c.d. Język zapytań EJB QL."

Podobne prezentacje


Reklamy Google