【发布时间】:2017-12-15 22:00:47
【问题描述】:
我有一个日历和一个房间实体。
我的日历实体如下所示:
public class CalendarEntity {
@EmbeddedId
private CalendarId calendarId = new CalendarId();
@Basic
@Column(name = "available", nullable = false)
private Boolean available;
@Basic
@Column(name = "price")
private double price;
@ManyToOne
@JoinColumn(name = "room_id", referencedColumnName = "id", insertable =
false, updatable = false)
private RoomEntity roomEntity;
}
@Embeddable
public class CalendarId implements Serializable {
@Column(name= "date", nullable = false)
private Date date;
@Column(name = "room_id", nullable = false)
private Integer room_id;
}
我的房间实体如下所示:
public class RoomEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id", nullable = false, unique = true)
private Integer id;
}
假设我在日历实体中有一些日期为 2017 年 10 月 5 日的条目, 2017-10-6、2017-10-7、2017-10-8,room_id=10。
我想构建一个查询,以便如果用户要求一个具有特定入住和退房日期的房间,那么他将获得正确的房间列表。
我该怎么做?
例如,用户请求 checkin=2017-10-6 和 checkout=2017-10-8 的房间,该房间应该出现在列表中。
查询应该是什么以便我得到正确的房间列表?
更新:
我现在的查询只检查房间是否在入住日期和退房日期可用,而不是在两者之间:
select r from RoomEntity r where r.id in (Select c1.calendarId.room_id from CalendarEntity c1, CalendarEntity c2 where (c1.calendarId.room_id = c2.calendarId.room_id) and (c1.calendarId.date =:checkin and c1.available=true) and(c2.calendarId.date =:checkout and c2.available=true))
【问题讨论】:
-
我觉得不一样。我想要的是,检查从登记日期到结帐日期的每个日期是否可用。如果是,则获取 room_id。
-
您的问题的答案是我引用的问题的一个小变化,您需要做的就是使用带有
NOT EXISTS的子查询...