-1

JDBCを使用してMySQLからJAVAにFK関係を実装しようとしています。オブジェクトのリストがGarazあり、それぞれに(車) オブジェクトGarazのリストがあります。Auto私は非常に複雑なデータを持っています。

私のMySQl DBは大丈夫です。私は次のようにしようとしています:

public static ArrayList <Garaz> selectRecords() throws SQLException {
    Connection dbConnection = null;
    Statement statement = null;

    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; ";

    // ArrayList lista = new ArrayList <Garaz>();

    try {
        dbConnection = getDBConnection();
        statement = dbConnection.createStatement();

        System.out.println(selectTableSQL);

        // execute select SQL stetement
        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);

            //System.out.println("nazwa : " + nazwa);
            //System.out.println("adres : " + adres);
            // return lista;
        }

    } catch (SQLException e) {
        System.out.println(e.getMessage());
    } finally {
        if (statement != null) {
            statement.close();
        }
        if (dbConnection != null) {
            dbConnection.close();
        }
    }
    return lista;
}

次のように読み取る方法がわかりませんResultSet rs:ArrayList Garazオブジェクト ( Garaz) を含み、各Garazオブジェクトに が含まれますArrayList Autorsそのため、 ( )からデータを読み取って 2 つのリスト (1 つは別のリストの一部) を作成することに大きな問題がありますResultSet。私はDBテーブルからすべてを持っていますGarazAuto、関係は混在しています。同様Garaz1にランダムAuto(車) が含まれます。

Auto2 つのリスト (1 つは別のリストの一部) をGaraz作成して、関係を維持するにはどうすればよいG_IDですか?

4

2 に答える 2

1

結果セットは、Garaz と Auto ごとに 1 つの結果 (別名行) を提供します。だからあなたはできる...

結果セットをそのまま解析し、必要な各 Garaz & Auto レコードを手動で作成しますが、重複する Garaz データを処理する必要があります。

また

MyBatis のようなフレームワークを使用してオブジェクトを取得するか、.

また

Garaz のリストに対して SELECT ステートメントを実行してから、別の SELECT ステートメントを実行して、各 Garaz の AUTO のリストを取得します。


Sudo code.....  


@Repository
public class StoreDbDAO 
{
    @Autowired  
    public void init(@Qualifier("dataSourceCDB") DataSource dataSource) {
        this.dataSource = dataSource;
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    }

    private static final String GET_USABLE_RECORDS = "SELECT d.ID, d.HARDWARE_ID " +
            " FROM DEVICE d " +
            " LEFT JOIN TABLEB o on o.X_ID = d.X_ID " +
            " WHERE " +
            " d.DEVC_HARDWARE_ID IS NOT NULL " +
            " AND o.CODE = ?  "";


    public List<Map<String, Object>> getStores(String cCode)
    {
        return simpleJdbcTemplate.queryForList(GET_USABLE_RECORDS, code);
    }
}

@Autowired StoreDbDAO storeDbDAO;

public void caller() { List> ストア = storeDbDAO.getStores();

List<Stores> storeRecords = new ArrayList[stores.size()];
for (Map<String, Object> store: stores)
{

  final String storeId = (String) store.get("HARDWARE_ID");
  StoreRecord x = new StoreRecord(storeId)
  storeRecords.add(x);


  List<Map<String, Object>> devicesInTheStore = storeDbDAO.getDevicesForStore(storeId);
  // convert these into something useful.
  x.setDevicesInStore(convertToList(devicesInTheStore));
}

}

于 2013-11-15T11:07:08.010 に答える
0

結果を反復処理し、行のGarazオブジェクトを既に作成しているかどうかを確認G_IDし、それを使用するか、新しいオブジェクトを作成する必要があります。これは、フィールドでソートすることで簡素化でき、変更時にG_ID新しいGarazオブジェクトを作成するだけです。G_ID

これを行う方法がわからないとコメントしているので、完全な例を次に示します。

public List<Garaz> getAllGaraz() throws SQLException {
    List<Garaz> garazList = new ArrayList<Garaz>();
    try (
        Connection con = getDBConnection();
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(
            "SELECT Garaz.G_ID, /* other garaz columns */ " +
                   "Auta.A_Id /*other auta columns */\n" +
            "FROM Garaz\n" +
            "LEFT JOIN Auta\n" +
            "ON Garaz.G_Id=Auta.G_Id\n" +
            "ORDER BY Garaz.G_Id");
    ) {
        Garaz currentGaraz = null;
        while (rs.next()) {
            int garazId = rs.getInt("G_ID");
            // Create Garaz only if it is different
            if (currentGaraz == null || currentGaraz.getId() != garazId) {
                // retrieve other columns
                currentGaraz = new Garaz(g_id /* + other garaz columns */);
                garazList.add(currentGaraz);
            }

            int a_id = rs.getInt("A_Id");
            // replacement of your condition of a_id != 0
            // 0 could be a valid value, check for null instead
            if (!rs.wasNull()) {
                // retrieve other columns
                Auto auta = new Auta(a_id /* + other auta columns */);
                // The list of Auta is part of the garaz
                currentGaraz.addAuta(auta);
            }
        }
        return garazList;
    }
}

public class Garaz {
    private final List<Auta> autaList = new ArrayList<Auta>();
    private final int id;

    public Garaz(int g_id /* + other fields*/) {
        id = g_id;
    }

    public int getId() {
        return id;
    }

    public void addAuta(Auta auta) {
        autaList.add(auta);
    }

    public List<Auta> getAutaList() {
        return new ArrayList<Auta>(autaList);
    }
}
于 2013-11-15T11:40:21.267 に答える