1

我正在编写一个汽车租赁应用程序,我的数据库中有两个表,Cars并且Bookings. 以下是每个字段:

Cars
CarID  |  Make  |  Model  |  Year

Bookings
BookingID  |  CarID  |  UserID  |  StartDate  |  EndDate  |  Paid

我正在编写一个称为getCars()返回ArrayList类型的方法Car。在我的Car班上,我有另一个ArrayListbookings,它保存了那辆车的所有预订。我可以在 的构造函数中插入预订Car,如下所示:

public Car(Integer carId, String make, String model, Integer year, ArrayList<Booking> bookings) {
    this.carId = carId;
    this.make = make;
    this.model = model;
    this.year = year;
    this.bookings = bookings;
}

但是,我无法从我的数据库中获取汽车和预订信息,然后Car从结果中构造正确的对象。我正在尝试这个:

String query = "SELECT * FROM Cars INNER JOIN Bookings ON Bookings.CarID = Cars.CarID";
PreparedStatement pstmt = conn.prepareStatement(query);
results = pstmt.executeQuery();

ArrayList<Booking> bookings = new ArrayList<Booking>();

while(results.next()) {

    bookings.add(new Booking(
        results.getDate("StartDate"),
        results.getDate("EndDate"),
        results.getBoolean("Paid"),
        results.getString("HouseName"),
        results.getString("AddrFirstLine"),
        results.getString("AddrSecondLine"),
        results.getString("PostCode")
    ));

    cars.add(new Car(
        results.getInt("CarID"),
        results.getString("Make"),
        results.getString("Model"),
        results.getInt("Year"),
        bookings
    ));
}

它有点工作,但会产生重复的结果。如果一辆车有两个预订,它将Car为同一辆车创建两个实例,而不是一个具有多个Car.bookings. 它还将提供Car数据库中的每个预订,如下所示:

截屏

在这种情况下如何正确构造Car对象?

谢谢!

4

1 回答 1

0

我假设这cars是一个List<Car>. 对于您的第一个问题,您有两个解决方案:

  • 在添加到地图之前替换List<Car>并检查汽车是否已经存在:Map<Integer, Car>

Integer carId = results.getInt("CarID");

if (!cars.containsKey(carId)) {
    cars.put(carId, new Car(...));
}
  • 替换List<Car>Set<Car>并实现equals()and hashCode()in Car,这样如果它已经包含另一个等于您正在添加的那个,Set则不会添加第二个CarCar

对于您的第二个问题,我建议您使用第二个Map<Integer, List<Booking>>包含每个CarID 的预订列表:

Map<Integer, List<Booking>> bookingsPerCar = ...;

// In your loop:
List<Booking> bookings = bookingsPerCar.get(results.getInt("CarID"));
if (bookings == null) {
    bookings = new ArrayList<>();
    bookingsPerCar.put(results.getInt("CarID"), bookings);
}

bookings.add(new Booking(...));
于 2013-04-11T08:35:33.263 回答