JPA - jak zwrócić tylko część listy

0

Cześć,

buduje zapytanie w JPA z Criteria API.
Struktura mojego projektu jest bardziej skomplikowana, ale nie ma potrzeby żebym wszystko przedstawiał, dlatego uprościłem.

Mam encje Author z polami:

String name;
List<Book> books;

Oraz encje Book z polami:

String title;
Author author;

Chcę w JPA wykonać powiedzmy coś takiego:
SELECT a.name, b.title
FROM authors a JOIN books b ON a.book_id = b.id
WHERE b.title='123';

W tym przypadku powinno mi zwrócić autora z jedną książką.
Buduje następujące zapytanie:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Author> criteria = builder.createQuery(Author.class);
Root<Author> authorRoot= criteria.from(Author.class);
ListJoin<root, Book> bookJoin= root.join(Author_.books);

        TypedQuery<Author> typedQuery = entityManager.createQuery(
                 criteria
                .select(authorRoot)
                .where(builder.equal(bookJoin.get(Book_title), "123"));

Chcę żeby mi zwróciło Autora z jedną książką, a nie autora ze wszystkimi książkami (jeżeli posiada jedną "123").
W tym momencie zapytanie "mówi" - daj mi autora, dla którego spełniony jest warunek, że ma książkę "123". Zwróci takiego. Jednak z jego całą listą - books.

Ktoś wie jak można to rozwiązać? Nie wchodzi w grę zamiana roota na books.

3
  1. Wyrzucamy JPA
  2. Używamy normalnego silnika który pozwala nam pisać zapytania takie jakie są potrzebne
  3. Profit!

Serio, bo teraz to klasycznie: walczysz z problemami, które nie istnieją w innych rozwiązaniach. JPA nadaje sie do CRUDa. Jak chcesz zrobić cokolwiek innego, to ciężko.

1

Zgadzam się z @Shalom a nawet jesli nie chcesz wywalać JPA to nie powod żeby wszędzie używać JPA. Zakładajac że korzystasz ze Springa możesz uzyć Spring JDBC a możesz też użyć JOOQ (zupełnie niezalażna biblioteka!)

0

Suherujac sie tym "SELECT a.name, b.title" zrob projekcje skoro checsz 2 kolumny a nie cala encje autora.

0

Problem jest taki, że JPA mam narzucony.

Ziemiak napisał(a):

Suherujac sie tym "SELECT a.name, b.title" zrob projekcje skoro checsz 2 kolumny a nie cala encje autora.

To tylko przykład. Chciałem napisać o co mi chodzi. Zależy mi na całej encji, z tym że nie z całą listą books.
Nie wiedziałem, że JPA jest tak ograniczony.

Czuje, że pozostanie mi w aplikacji wyfiltrować listę books.

1
jazyna napisał(a):

Problem jest taki, że JPA mam narzucony.

Ziemiak napisał(a):

Suherujac sie tym "SELECT a.name, b.title" zrob projekcje skoro checsz 2 kolumny a nie cala encje autora.

To tylko przykład. Chciałem napisać o co mi chodzi. Zależy mi na całej encji, z tym że nie z całą listą books.
Nie wiedziałem, że JPA jest tak ograniczony.

Czuje, że pozostanie mi w aplikacji wyfiltrować listę books.

Racjonalnie to da się na pewno wyfiltrować w JPA, tyle że ja nigdy czegoś podobnego nie ćwiczyłem.
Na 99% fragment w Criteria API nie odpowiada JPQL (a ten wydaje się przynajmniej mniej zły) , ale ja bez wódki nigdy tego dobrze nie czytałem.

Kwerenda JPA po niektórych polach łączy wady wszystkich możliwych technik.
"O ile" JPA *może * mieć sens przy odczycie konkretnych obiektów, to zestaw pól to ni pies, ni wydra, ni obiekt.
A wszystkie uciążliwości JPA są uwydatnione. Jak jedzenie zupy widelcem.

Do wymienionych użytecznych bibliotek dodam JDBI

3

Skoro musisz korzystać z JPA, to zastanów się nad użyciem https://thoughts-on-java.org/jpa-native-queries/

Nie zawsze jest czas i warunki, aby przeprowadzać rewolucję w zastanym projekcie często niemałych rozmiarów :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1