Wyświetlanie danych z wielu tabel.

0

Witam. Mam tabelę osoba, i w drugiej tabeli klucz obcy do tej tabeli. Mniej więcej coś takiego to jest:

tabela osoba ma pola
id, imie, nazwisko
a druga tabela załóżmy
swoje id, jakieś pole opis i klucz obcy do tabeli osoba

I teraz mam problem, bo chcę w tabeli wyświetlić np.
imie nazwisko i opis są to dane z dwóch tabel. A w JSF można zrobić coś takiego:

<p:dataTable value="#{userMB.allData}" var="dane" widgetVar="customerTable">

i metoda allData może mi zwrócić dane w formie listy z jednego typu tabeli albo tabeli osoba albo tej drugiej tabeli.
albo List<Osoba> allData(); albo List<DrugaTabela> allData();
I nie mam jak wyświetlić danych tabeli, której nie zwróci ta metoda w tabeli. Jeśli zdecyduję się na zwrot danych typu DrugaTabela to mogę wyświetlić jedynie id osoby a imienia i nazwiska nie. W jaki sposób można to zrealizować, żeby mieć dostęp do wszystkich pełnych danych z obu tabel?

1

Obawiam się, że sam musisz sobie sam napisać zapytanie SQL uwzględniające JOIN tych dwóch tabel. Oczywiście możesz ściągnąć obie tabele i później iteracyjnie połączyć je w listę obiektów nowego typu (którego i tak tu potrzebujesz), ale to bardzo brzydkie podejście.

0

No tak, ale co mi da samo zapytanie? Muszę jakoś zwrócić te dane w formie klasy. Więc chyba bez tworzenia jakiejś nowej klasy uwzględniającej te wszystkie dane z obu tabel się nie obejdzie?

1

Po pierwsze nie wiem czy używasz jakiegoś JPA , hibernate czy walisz zapytania poprzes JDBC ??

Jeśli używasz encji np Osoba i tam masz np 2 obiekt typu Adress czyli np:

@NamedQueries({
    @NamedQuery(name="Osoba.getWithAddress", query="Select n from Osoba o left join fetch n.address where o.id=:id")
})
@Entity
public class Osoba{

    @Id
    private Integer id;

    @JoinColumn(name="adres_id")
    @OneToMany(fetch=FetchType.LAZY)
    private List<Adress> adress = new ArrayList<>();
}

No i za pomocą tego zapytania wyciągasz osobe z jej adresami, chyba że dasz sobie FetchType.EAGER no to nie dajesz w selekcie left join fetch.

Innym wyjściem jest utworzenie sobie klasy opakowania np takie DTO:

public class ObobaDTO{
    private Osoba osoba;

    private List<Adress> address = new ArrayLIst<>();
    .....
}

No i uzupełniasz takie DTO i wysyłasz do klienta .

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