JAVA/MYSQL 2 ArrayListy na podstawie 2 tabel

0

Witam, mam 2 tabelki w MySQL - Garaż i Auta, teraz chce je wczytać do JAVY, mam ArrayList <Garaz> i każdy obiekt garaż ma mieć ArrayList <Auta> z listą aut danego garażu (na podstawie FK G_id ).
Mam:

String selectTableSQL = "SELECT Garaz.G_ID, Garaz.Nazwa, Garaz.Adres, Garaz.LiczbaMiejsc, Garaz.LiczbaPoziomow, "
                    + "Garaz.Czynny, Auta.A_Id, Auta.Model, Auta.Kolor, Auta.IloscDrzwi, Auta.Rejestracja\n" +
                    "FROM Garaz\n" +
                    "LEFT JOIN Auta\n" +
                    "ON Garaz.G_Id=Auta.G_Id\n" +
                    "ORDER BY Garaz.G_Id; ";
ResultSet rs = statement.executeQuery(selectTableSQL);

while (rs.next()) {
            int g_id = rs.getInt("G_ID");
            String nazwa = rs.getString("NAZWA");
            String adres = rs.getString("ADRES");
            int lmiejsc = rs.getInt("LICZBAMIEJSC");
            int lpoz = rs.getInt("LICZBAPOZIOMOW");
            boolean czynny = rs.getBoolean("CZYNNY");

           ArrayList lista2 = new ArrayList <Auto>();


           int a_id = rs.getInt("A_Id");
           String model = rs.getString("Model");
           String kolor = rs.getString("Kolor");
           int ildrzwi = rs.getInt("IloscDrzwi");
           String rejestracja = rs.getString("Rejestracja");

           Auto d = new Auto(a_id, model, kolor, ildrzwi, rejestracja);
           if (a_id !=0){
           lista2.add(d);
}
Garaz f = new Garaz(g_id, nazwa, lista2, adres, lmiejsc, lpoz, czynny);
lista.add(f);

I to co dostaje jest kompletnie pomieszane, nie ma zachowanej relacji Garaż zawiera Auta na podstawie G_ID.
Proszę o pomoc

0

Moim zdaniem ten kod nie ma sensu.

while (rs.next()) {
            int g_id = rs.getInt("G_ID");
            String nazwa = rs.getString("NAZWA");
            String adres = rs.getString("ADRES");
            int lmiejsc = rs.getInt("LICZBAMIEJSC");
            int lpoz = rs.getInt("LICZBAPOZIOMOW");
            boolean czynny = rs.getBoolean("CZYNNY");
            //tutaj dodaj sprawdzenie czy Garaz o danym G_ID jest już w kolekcji, jeśli jest to pobierz jego ArrayList<Auto> lista2, 
            //jeśli nie ma, to stwórz nową kolekcję lista2, 
            //nowy obiekt typu Garaz i  dodaj go listy
            //poniższe trzy instrukcje tylko wtedy gdy pojawił się nowy garaż
            ArrayList lista2 = new ArrayList <Auto>();
            Garaz f = new Garaz(g_id, nazwa, lista2, adres, lmiejsc, lpoz, czynny); 
            lista.add(f);           
 
 
           int a_id = rs.getInt("A_Id");
           String model = rs.getString("Model");
           String kolor = rs.getString("Kolor");
           int ildrzwi = rs.getInt("IloscDrzwi");
           String rejestracja = rs.getString("Rejestracja");
 
           Auto d = new Auto(a_id, model, kolor, ildrzwi, rejestracja);
           if (a_id !=0){ //po co ten warunek?
           lista2.add(d);
           }      
}
0

Zgadza się, Twoje zapytanie zwraca wszystkie rekordy z bazy, dlatego koniecznym jest sprawdzanie czy dany wpis w kolekcji już nie istnieje, tak jak napisał bogdans.
W celach czysto dydaktycznych wrzucam poniższy kod. Część operacji można przerzuć bezpośrednio na klasę Auto czy Kontener zawierający spis garaży

 
ArrayList<Garaz> lista1 = new ArrayList<>();
while(rs.next()){
	int g_id = rs.getInt("G_ID");
	boolean zawiera = false;
	for(int i=0; i<lista1.size(); i++){ // w pętli sprawdzamy czy lista1 zawiera już garaż o takim id
		if(lista.get(i).getIdGarazu() == g_id)
			zawiera = true; // jeśli zawiera ustawiamy flage zawiera na true
	}
	if(!zawiera){ // sprawdzamy stan flagi, jeśli nie ma takiego garażu czas go dodać
		String nazwa = rs.getString("NAZWA");
		String adres = rs.getString("ADRES");
		int lmiejsc = rs.getInt("LICZBAMIEJSC");
		int lpoz = rs.getInt("LICZBAPOZIOMOW");
		boolean czynny = rs.getBoolean("CZYNNY");
		
		Garaz g = new Garaz(g_id, nazwa, lista2, adres, lmiejsc, lpoz, czynny);
		
		// jeśli jest to nowy garaż to napewno nie ma tam jeszcze żadnego auta,
		// zatem czas stworzyć obiekt typu Auto
		int a_id = rs.getInt("A_Id");	  
		String model = rs.getString("Model");
		String kolor = rs.getString("Kolor");
		int ildrzwi = rs.getInt("IloscDrzwi");
		String rejestracja = rs.getString("Rejestracja");
		
		Auto d = new Auto(a_id, model, kolor, ildrzwi, rejestracja);
		ArrayList<Auto> lista2 = new ArrayList<>();
		lista2.add(d); // dodajemy auto do listy
		g.addListeAut(lista2); // dodajemy liste aut do garazu
		lista1.add(g); // dodajemy garaz do listy
	}
	else{ // wiemy że garaż o takim id istnieje, więc trzeba go znaleźć i pobrać liste zaparkowanych //samochodów
		for(int i=0; i<lista1.size(); i++){
			if(lista.get(i).getIdGarazu() == g_id){
				
				Garaz g = lista1.get(i);	
				int a_id = rs.getInt("A_Id");	  
				String model = rs.getString("Model");
				String kolor = rs.getString("Kolor");
				int ildrzwi = rs.getInt("IloscDrzwi");
				String rejestracja = rs.getString("Rejestracja");
				zawiera = false;
				for(int k; k<g.getLIsteAut().size(); k++){ // tutaj sprawdzimy sobie czy auto o takim id //jest zaparkowane w naszym garażu
					if(a_id == g.getListeAut().get(k))
						zawiera = true;
				}
				if(!zawiera){ // jeśli nie (stan flagi) zaparkujmy
					List<Auto> lauto = g.getListeAut();
					lauto.add(new Auto(a_id, model, kolor, ildrzwi, rejestracja));
				}
			}
			
		}
	}
}


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