【问题标题】:JPQL checkif room is available between dates [duplicate]JPQL检查日期之间是否有可用房间[重复]
【发布时间】: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的子查询...

标签: java mysql sql jpa jpql


【解决方案1】:

一种方法是:SELECT count(c.calendarId.room_id), c.calendarId.room_id FROM CalendarEntity c WHERE c.available = true and c.calendarId.date BETWEEN :checkin and :checkout GROUP BY c.calendarId.room_id HAVING count(c.calendarId.room_id) >= :noOfDays noOODays 表示从需要预订的入住和退房日期计算的天数。

【讨论】:

    【解决方案2】:
    SELECT r FROM RoomEntity r 
    WHERE r.id 
    in (select c1.calendarId.room_id 
        FROM CalendarEntity c1 JOIN CalendarEntity c2 
        WHERE c1.calendarId.room_id = c2.calendarId.room_id  
        AND ((c1.calendarId.date BETWEEN :checkin AND :checkout) 
             AND (c1.available=true and c2.available=true));
    

    【讨论】:

      猜你喜欢
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多