wtorek, 16 października 2012

EJB 3.1 [4] - Persistence

Interfejs Query:
- getResultList(); getSingleResult();
- executeUpdate();
- get/setMaxResults(int maxResults);
- get/setFirstResult(int startPosition);
- setHint(); getHints();
- getParameter/s(); getParameterValue();
- setParameter(); //na 50 sposobów
- get/setFlushMode();
- get/setLockType();
- T unwrap(Class);

Interfejs EntityManager:
- createQuery();
- createNamedQuery();
- createNativeQuery();

W zapytaniach używamy atrybutu name encji (domyślnie nazwa klasy).
Parametry mogą być numeryczne (?1) lub nazwane (:name). Ustawiajac parametry typu Calendar/Date przekazujemy TemporalType.
Przykład zapytania JPQL:
"object" jest opcjonalnym archaizmem, "as" też jest opcjonalne. Można zapisać:

Jeżeli getResultList() wyciąga więcej niż jedną kolumnę lub encję, wyniki w zwracanej liście zostaną zagregowane w tablice Object[]:

Można zrobić niejawnego joina nawigując po polach:

Nie można nawigować po polach klasy, która nie jest encją (czyli która jest zapisana w bazie jako bytestream). Po embedable można.
Można w zapytaniu wywołać konstruktor:

Istnieje (nieintuicyjny) operator IN pozwalający przypisać identyfikator elementom kolekcji

To samo możemy osiągnąć joinem:

Jak chcemy zaciągnąć powiązane encje używamy join fetch:

W części WHERE można użyć operatorów arytmetycznych (ale w części SELECT już nie).
Nie można konkatenować Stringów plusem. Jest do tego funkcja concat().
Można porównywać Stringi poprzez <, <=, choc specyfikacja nie określa, jak będą porównywane. Nie można użyć between na Stringach. Between jest inclusive. Porównywanie dwóch encji porówna je po kluczach głównych. Wartość wyrażenia where null in (1,2) jest nieprzewidywalna. Poniższe zapytanie nie wyciągnie osób, które nie mają adresu:
Poniższe zapytanie zwóci listę z nullami, jeżeli istnieją osoby bez adresu:

Można używać "is empty" oraz "member of".
Wyrażenia regularne: % - dowolna ilość znaków, _ - jeden znak, \ - escapowanie.
Dostępne funkcje: lower, upper, trim(leading, trailing, both),concat, lenght, locate(str, str, start), substring(str, start, length), abs, sqrt, mod,current_date, current_time, current_timestamp
Agregujące: count, max, min, avg, sum
Pole, po którym sortujemy (order by) musi należeć do wyciąganej encji i znajdować się w części SELECT. Poniższe zapytanie jest błędne:

Można wykonywać operacje masowe: [update where]/[delete from where]. Przedtem warto wykonać em.flush() i em.clear() by nie rozsynchronizować encji.
W encji można zdefiniować nazwane zapytania i mapowania dla zwracanych wyników. Przykłady:

Brak komentarzy:

Prześlij komentarz