2017-07-11 67 views
1

我有日曆和房間實體。JPQL checkif room在日期間可用

我的日曆實體看起來是這樣的:

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 with room_id = 10。

我想構建一個查詢,以便如果用戶請求具有特定簽入和結帳日期的房間,那麼他將獲得房間的正確列表。

我該怎麼做?

例如,用戶要求籤入= 2017-10-6和結帳= 2017-10-8房間,房間應該出現在列表中。

查詢應該是什麼所以我得到正確的房間清單?

UPDATE:

查詢我對現在只能如果房間可在簽入日期和結賬日期,但不是在間檢查:

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)) 
+0

我不認爲它是一樣的。我想要的是,檢查是否每個日期從入住日期到結帳日期可用。如果是這樣,那麼得到room_id。 – peterthunder

+0

您的問題的答案是我引用的問題的一個小變化,所有您需要做的就是使用帶有NOT EXISTS的子查詢... – crizzis

回答

1

的方法是:SELECT COUNT( c.calendarId.room_id),c.calendarId.room_id FROM CalendarEntity c WHERE c.available = true和c.calendarId.date BETWEEN:checkin和:checkout GROUP BY c.calendarId.room_id HAVING count(c.calendarId.room_id)> =:noOfDays noODays表示從預訂所需的入住日期和結帳日期計算的日子。

0
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));