Wyświetlanie danych z wielu tabel.

Wyświetlanie danych z wielu tabel.
O1
  • Rejestracja: dni
  • Ostatnio: dni
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?

KK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 135
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.

O1
  • Rejestracja: dni
  • Ostatnio: dni
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?

L4
  • Rejestracja: dni
  • Ostatnio: dni
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:

Kopiuj
@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:

Kopiuj
public class ObobaDTO{
	private Osoba osoba;

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

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

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.