【问题标题】:Adding car bookings to car object from single SQL query with JOIN使用 JOIN 从单个 SQL 查询将汽车预订添加到汽车对象
【发布时间】:2013-04-11 08:19:17
【问题描述】:

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

Cars
CarID  |  Make  |  Model  |  Year

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

我正在编写一个名为getCars() 的方法,它返回Car 类型的ArrayList。在我的Car 类中,我有另一个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 对象。我正在尝试这个:

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 对象?

谢谢!

【问题讨论】:

    标签: java jsp ms-access join


    【解决方案1】:

    我假设carsList&lt;Car&gt;。对于您的第一个问题,您有两种解决方案:

    • List&lt;Car&gt; 替换为Map&lt;Integer, Car&gt; 并在将其添加到地图之前检查汽车是否已经存在:
    
    Integer carId = results.getInt("CarID");
    
    if (!cars.containsKey(carId)) {
        cars.put(carId, new Car(...));
    }
    
    • Set&lt;Car&gt;替换List&lt;Car&gt;并在Car中实现equals()hashCode(),这样Set就不会添加第二个Car,如果它已经包含另一个Car等于您正在添加的一个

    对于您的第二个问题,我建议您使用第二个Map&lt;Integer, List&lt;Booking&gt;&gt;,其中包含每个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(...));
    

    【讨论】:

    • 使用地图的解决方案会很棒,谢谢。但是,我仍然无法正确添加预订。我试过这个代码:pastebin.com/Nf0tVLi1 但是现在网页显示“在数据库中找不到汽车”,所以它一定是在某个地方出错了。你能看看吗?谢谢。
    • 代码似乎是正确的,也许是在调用getCars()的代码中?另外,bookingsPerCar 添加数据后,您似乎没有使用它,您真的需要它吗?
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2019-05-20
    • 2020-12-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    相关资源
    最近更新 更多