Java 使用JOIN从单个SQL查询向car对象添加汽车预订

Java 使用JOIN从单个SQL查询向car对象添加汽车预订,java,jsp,ms-access,join,Java,Jsp,Ms Access,Join,我正在写一个租车申请,我的数据库中有两个表,Cars和Bookings。以下是每个字段的字段: Cars CarID | Make | Model | Year Bookings BookingID | CarID | UserID | StartDate | EndDate | Paid 我正在编写一个名为getCars的方法,它返回Car类型的ArrayList。在我的汽车课上,我有另一个ArrayList叫做bookings,它保存了那辆车的所有预订。我

我正在写一个租车申请,我的数据库中有两个表,Cars和Bookings。以下是每个字段的字段:

Cars
CarID  |  Make  |  Model  |  Year

Bookings
BookingID  |  CarID  |  UserID  |  StartDate  |  EndDate  |  Paid
我正在编写一个名为getCars的方法,它返回Car类型的ArrayList。在我的汽车课上,我有另一个ArrayList叫做bookings,它保存了那辆车的所有预订。我可以在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.bookings的实例。它还将为每辆车提供数据库中的所有预订,如下所示:

在这种情况下,如何正确构造汽车对象

谢谢

我假设汽车是一个列表。对于第一个问题,您有两种解决方案:

将列表替换为地图,并在将其添加到地图之前检查车辆是否已存在: 将列表替换为Set,并在Car中实现equals和hashCode,这样,如果集合中已经包含另一辆与您要添加的汽车相等的汽车,则该集合将不会添加第二辆汽车 对于第二个问题,我建议您使用第二个地图,其中包含每个汽车id的预订列表:


使用地图的解决方案会很好,谢谢。但是,我仍然无法正确添加预订。我尝试了这个代码:但是现在网页显示数据库中没有找到汽车,所以它一定是出了什么问题。你能看一下吗?谢谢。代码似乎是正确的,也许是在调用getCars的代码中?另外,在向bookingsPerCar添加数据后,您似乎没有使用它,您真的需要它吗?
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
    ));
}

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

if (!cars.containsKey(carId)) {
    cars.put(carId, new Car(...));
}
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(...));