JPQL - pozyskiwanie danych dwóch klas jednocześnie

JPQL - pozyskiwanie danych dwóch klas jednocześnie
JR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

W projekcie (JSF 2.2, Primafaces 6.2,Java 1.8, Java, EJB) chciałbym spróbować pobierać pełne dane z dwóch klas/encji za pomocą poniższego zapytania w metodzie :

public void bulidList() {

        EntityManager em=studentService.getInstanceOfEntityManager();

            String klasa1="Student";

                String klasa2="Division";

        Query query = em.createQuery("select s,d from "+klasa1+" s,"+klasa2+" d where s.id=d.signatories_id");

                List<?> result = query.getResultList();

                        logger.log(Level.INFO, "Combined List 1st element :" + result.get(0));

    }
Listę chce użyć do generowania tabeli prezentującej połączone tabele
.
em jest pobrany za pomocą obiektu studentDao tej klasy
.
Kompilator/JRE nie zgłaszają błędów po kompilacji/wykonaniu, natomiast logi serwera wskazują na odpowiedź w loggerze jak niżej :

2018-08-27 23:34:14,440 INFO  [org.primefaces.showcase.view.data.datatable.GrantEditView] (default task-3) Combined Object List :[Ljava.lang.Object;@4ecfdb5f
.
Pytanie jest następujące : co/jaki obiekt na liście jest wynikiem takiego zapytania ?
Jak go użyć, bowiem metoda getClass() zwraca jedynie Object i czy to jest w ogóle w tym przypadku możliwe?

?

krancki
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: 74.7261832, -41.7409518
  • Postów: 151
0

        Query query = em.createQuery("select s,d from "+klasa1+" s,"+klasa2+" d where s.id=d.signatories_id");

                List<Object[]> result = query.getResultList();

Dostajesz Tablice obiektów, teraz byś musiał odwołać się do pierwszego elementu listy a potem do elementu tablicy
result.get(0)[0]

mateuszd
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
0

W jpql jest możliwość skorzystanie z dto jeśli chcesz zwrócić tylko część twojej encji, ale nie wiem czy w twoim przypadku to zadziała

Kopiuj
em.createQuery("select new pl.pakiet.TwojeDto(s.id,s.name) from Student s");
JR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

..czy 'TwojeDto' to jakaś szczególna pre-definiowana/natywna klasa javy do pobrania z pakietu import java...etc., czy też sam muszę sobie ją "napisać" ?
.
Pytam, bo do 'rozmowy' z bazą używam klas 'Dao' ?
.
To jest to samo ?

JR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

Wszystko jest fajnie ale powstał mały problem, bowiem nie ma jak się odwołać do i-tego [Student,Division] poszczególnego pola danego obiektu Student lub Division tzn.
poniższy zapis :
.
result.get(5)[0] - zwraca obiekt Student (kolejny na liście),

ale zapis :
.
result.get(5)[0].getId() lub
.
result.get(5)[0].getFirstName()

świeci na czerwono i Intelij IDEA nie "widzi" poszczególnych pól obiektów Student czy też Division.

Dopiero zapis z jawnym rzutowaniem elementu tablicy :

Student student=(Student) result.get(5)[0];

pozwala na odwołanie się do pola np. student.getId().
.
Jak jest rada aby móc odwoływać się do poszczególnych pól obiektów, w tablicach na liście, bezpośrednio poprzez result.(....) ,a nie poprzez casting.
Jest to konieczne do umożliwienia odwoływania się w definicji pól tablicy xhtml prezentującej listę połączonych obiektów z bazy mySQL

?

krancki
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: 74.7261832, -41.7409518
  • Postów: 151
0

Jak jest rada aby móc odwoływać się do poszczególnych pól obiektów, w tablicach na liście, bezpośrednio poprzez result.(....) ,a nie poprzez casting.
Jest to konieczne do umożliwienia odwoływania się w definicji pól tablicy xhtml prezentującej listę połączonych obiektów z bazy mySQL

Posiadasz dane typu Object , będziesz musiał rzutować. Zrób sobie metode która posiada parametr Object lub Object[], w środku implementacja tworzenia nowej listy wraz z rzutowaniem oraz return listy lub obiekt typu Student(Jak wolisz).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.