Archiwa tagów: Criteria API

Criteria API multiselect i różnice w implementacjach JPA

Tworzenie zapytań w JPA to rzecz zarazem łatwa jak i trudna. Łatwa, bo bardzo prosto jest stworzyć zapytanie oparte o zwykłego SQL’a lub JPQL’a, a nawet zapytania tworzone za pomocą Criteria API nie są czymś nadzwyczajnym. Zarazem jest to jednak trudny temat, bo trzeba pamiętać o wielu kwestiach związanych z wydajnością lub bezpieczeństwem, których pominięcie może spowodować spore problemy w przyszłości. Nie chcę tu się rozpisywać po trochu o wszystkim, a poruszyć jeden temat, który zaciekawił mnie szczególnie.

Jedną z ważniejszych rzeczy związanych z projektowaniem zapytań do bazy danych jest zawężanie zapytań w taki sposób, aby zwracały tylko niezbędne do konkretnego widoku aplikacji dane. Gdy używamy technologii ajaxowych (np. GWT), ogranicza to nam ilość przesyłanych danych do przeglądarki, a nawet jeśli nie, to mniej cierpi na tym serwerowy cache (jeśli go włączyliśmy). JPA dostarcza kilka rozwiązań, które umożliwiają zawężenie wyników zapytań, a ciekawsze z nich to Constructor Expression wykorzystane wraz z Named Queries, oraz multiselect w Criteria API. Ciekawsze, bo oba pozwalają zmapować zapytanie bezpośrednio na konstruktor klasy DTO. Dziś będzie o tylko o tym drugim, czyli o metodzie multiselect.

Czytaj więcej »

Relacja wiele-do-wielu i Criteria API w JPA 2.0

Jakiś czas temu zapowiadałem pojawienie się artykułu na temat relacji wiele-do-wielu zrealizowanej za pomocą RequestFactory w GWT. Od tamtej pory trochę wody w Wiśle upłynęło, a ja z braku czasu nie miałem kiedy napisać o swoich poczynaniach. Jako że miniony weekend znalazłem trochę czasu i spędziłem go pod znakiem GWT, postanowiłem nadrobić zaległości.

Zdecydowałem się jednak rozdzielić temat RequestFactory od tematu JPA i opisać te dwa zagadnienia osobno. Podyktowane jest to przede wszystkim chęcią rozpisania się trochę o tym pierwszym, a i w związku z JPA chciałbym przedstawić kilka ciekawostek. Materiału trochę jest, więc zebranie tego wszystkiego razem tylko wydłużyłoby czas oczekiwania na nowy wpis. Sam projekt, a raczej kontynuacja tego rozpoczętego przy pierwszych bojach z RequestFactory i rozwijanego dalej podczas opisu możliwości walidacji encji w JPA i GWT, jest już prawie na ukończeniu i można go pobrać z repozytorium.

Relacja wiele-do-wielu (many-to-many) jest chyba najtrudniejszą relacją do zamodelowania i zrozumienia dla początkujących programistów. Jako jedyna po stronie bazy danych wymaga utworzenia osobnej tabeli (tzw. intersekcji) łączącej rekordy dwóch głównych tabel. Z tego też powodu zazwyczaj sprawia najwięcej trudności przy mapowaniu tabel na encje za pomocą JPA (podobnie zresztą w czystym Hibernate). Upraszczając problem, relację wiele-do-wielu można rozłożyć na dwie relacje jeden-do-wielu (one-to-many) i dołożyć mapowanie osobnej encji pełniącej rolę intersekcji. Wtedy jednak w encjach głównych dostaniemy bezpośredni dostęp za pomocą kolekcji jedynie do encji intersekcji, a nie do siebie nawzajem. Jak więc poprawnie napisać mapowanie wiele-do-wielu używając adnotacji @ManyToMany?
Czytaj więcej »