我正在编写一个汽车租赁应用程序,我的数据库中有两个表,Cars和Bookings。以下是每个字段的字段:
Cars
CarID | Make | Model | Year
Bookings
BookingID | CarID | UserID | StartDate | EndDate | Paid我正在编写一个名为getCars()的方法,它返回Car类型的ArrayList。在我的Car类中,我有另一个名为bookings的ArrayList,它保存该汽车的所有预订。我可以在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对象?
谢谢!
发布于 2013-04-11 16:35:33
我假设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>,并在Car中实现equals()和hashCode(),这样,如果Set已经包含与您正在添加的<代码>H219<代码>F220相同的另一个<代码>D18,则Set不会添加第二个Car对于第二个问题,我建议您使用第二个Map<Integer, List<Booking>>,它包含每个Car id的预订列表:
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(...));https://stackoverflow.com/questions/15943886
复制相似问题