przygotowa pawelkasprowski pl J 2 EE Bazy danych
przygotował: pawel@kasprowski. pl J 2 EE: Bazy danych c. d. Język zapytań EJB QL
przygotował: pawel@kasprowski. pl Język EJB QL • Pozwala na bardziej zaawansowane wydobywanie danych z bazy niż find() • Zapytanie tworzy się przez metodę: – manager. create. Query() – manager. create. Native. Query() – manager. create. Named. Query() • Powstający obiekt Query może zostać uruchomiony • Najprostszy przykład: lista wszystkich samochodów – manager. create. Query("from Samochod s"). get. Result. List();
przygotował: pawel@kasprowski. pl Język EJB QL • Podstawa: klasa Query • Pobieranie danych – get. Result. List() – get. Single. Result() – execute. Update() • Ustawienia – – – set. First. Result(int) set. Max. Results(int) set. Parameter(name|position, value|date|calendar) set. Flush. Mode(Flush. Mode. Type) set. Hint(String name, Object value)
przygotował: pawel@kasprowski. pl Przykłady • Cała tabela Query query = manager. create. Query("from Samochod s"); Collection samochody = (Collection)query. get. Result. List( ); • Jeden rekord Query query = manager. create. Query( "from Samochod s where s. numer='XYZ 123'"); Samochod sam = (Samochod)query. get. Single. Result( );
przygotował: pawel@kasprowski. pl Ustawianie parametrów • Parametry wg nazwy Query query = manager. create. Query( "from Samochod s where s. numer=: numer"); query. set. Parameter("numer", "XYZ 123"); Samochod sam = (Samochod)query. get. Result. List( ); • Parametry wg pozycji Query query = manager. create. Query( "from Samochod s where s. numer=? 1"); query. set. Parameter(1, "XYZ 123"); Samochod sam = (Samochod)query. get. Result. List( );
przygotował: pawel@kasprowski. pl Parametry zagnieżdżone // nazwa to kolumna z klasy Marka!!! public List find. By. Name(String name){ Query query = manager. create. Query( "from Samochod s where marka. nazwa=: nazwa"); query. set. Parameter("nazwa", name); return query. get. Result. List(); }
przygotował: pawel@kasprowski. pl Użycie dat • query. set. Parameter(name, date, temporal. Type) • Trzeci parametr opisuje na jaki typ SQL mapować kolumnę • Temporal. Type. DATE|TIMESTAMP Query query = manager. create. Query( "from Car c where c. year=: date"); query. set. Parameter("date", new Date(), Temporal. Type. DATE); Collection cars = query. get. Result. List( );
przygotował: pawel@kasprowski. pl Stronicowanie rezultatów • set. Max. Results(int limit) • set. First. Result(int offset) List get. All. Cars(int limit, int offset) { Query query = manager. create. Query("from Samochod s"); return query. set. Max. Results(limit). set. First. Result(offset). get. Result. List( ); }
przygotował: pawel@kasprowski. pl Rozszerzanie zapytań • Cały obiekt – 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
przygotował: pawel@kasprowski. pl Czytanie wielu kolumn List result = manager. create. Query("select number, year from Samochod s"). get. Result. List(); Iterator it = result. iterator(); while(it. has. Next()) { Object[ ] row = (Object[ ])it. next(); String number = (String)row[0]; Date year = (Date)row[1]; }
przygotował: pawel@kasprowski. pl Tworzenie obiektów na rezultat class Car. Info{ String no; Date pr_year; }. . . List result = manager. create. Query("select new Car. Info(number, year) from Samochod s"). get. Result. List(); Iterator it = result. iterator(); while(it. has. Next()) { Car. Info cin = (Car. Info)it. next(); System. out. println(cin. no+" "+cin. pr_year); } * UWAGA! Należy dostarczyć odpowiednie konstruktory
przygotował: pawel@kasprowski. pl Elementy jak w SQL • • • INNER JOIN LEFT JOIN IS NULL BETWEEN, NOT BETWEEN IN, NOT IN LIKE
przygotował: pawel@kasprowski. pl Elementy specyficzne EJB QL • JOIN FETCH • IS EMPTY • MEMBER OF, NOT MEMBER OF
przygotował: pawel@kasprowski. pl Funkcje • Tekstowe: – – – – LOWER(txt) UPPER(txt) TRIM ([LEADING|TRAILING|BOTH] [sign] txt) CONCAT(txt 1, txt 2) LENGTH(txt 1) LOCATE(txt 1, txt 2[, start]) SUBSTRING(txt 1, start, len) • Matematyczne: ABS, SQRT, MOD • Datowe: CURRENT_DATE, CURRENT_TIMESTAMP
przygotował: pawel@kasprowski. pl 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)
przygotował: pawel@kasprowski. pl Inne możliwości • Użycie klasycznego SQL – objekt Data. Source – objekt Native. Query • Definiowanie "named queries" – @Named. Query("qname", "select. . . ") – manager. create. Named. Query("qname")
przygotował: pawel@kasprowski. pl Jak używać zapytań • Mniej zapytań – szybsze działanie! • Przykład: jak dużo samochodów każdej marki List marki = manager. create. Query("from Marka m"). get. Result. List(); Iterator it = marki. iterator( ); while (it. has. Next( )) { Marka marka = (Marka)it. next( ); Query query = manager. create. Query( "from Samochod s where marka=: marka"); query. set. Parameter(„marka", marka); List ilsam = query. get. Result. List(); System. out. println(marka. get. Nazwa() + ": " + ilsam. size()); }
przygotował: pawel@kasprowski. pl Przykład zapytania • Popzednio: liczba zapytań = 1+ liczba typów • Rozwiązanie jednym zapytaniem: List marki = manager. create. Query( "select m. nazwa, m. typ, count(*) from Marka m"+ "JOIN m. samochody c GROUP BY m. nazwa, " + "m. typ"). get. Result. List(); Iterator it = marki. iterator( ); while (it. has. Next( )) { Object[ ] row = (Object[ ])it. next(); String marka = (String)row[0] + (String)row[1]; Long il = (Long)row[2]; System. out. println(marka+": "+il); }
przygotował: pawel@kasprowski. pl Przykłady/Ćwiczenia
- Slides: 19