2017-07-11 5 views
1

私はカレンダーとルームエンティティを持っています。日付の間にJPQLチェックボックスが利用可能です

マイカレンダーエンティティは次のようになります。

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。

ユーザーが特定のチェックインとチェックアウト日付の部屋を求めた場合、彼は部屋の正しいリストを取得するようにクエリを作成したいと考えています。

どうすればいいですか?

たとえば、ユーザーはcheckin = 2017-10-6とcheckout = 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からCalendarEntity c WHERE c.available = trueおよびc.calendarId.date BETWEEN:チェックインとチェックアウト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)); 
関連する問題