首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JOIN将汽车预订从单个SQL查询添加到汽车对象

使用JOIN将汽车预订从单个SQL查询添加到汽车对象
EN

Stack Overflow用户
提问于 2013-04-11 16:19:18
回答 1查看 543关注 0票数 1

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

代码语言:javascript
复制
Cars
CarID  |  Make  |  Model  |  Year

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

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

代码语言:javascript
复制
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对象时遇到了问题。我试着这样做:

代码语言:javascript
复制
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对象?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-11 16:35:33

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

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

代码语言:javascript
复制
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的预订列表:

代码语言:javascript
复制
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(...));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15943886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档