2017-07-11 2 views
1

J'ai un calendrier et une salle.La salle des vérifications JPQL est disponible entre les dates

Mon entité Calendrier ressemble à ceci:

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; 
} 

My Room entité ressemble à ceci:

public class RoomEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Column(name = "id", nullable = false, unique = true) 
    private Integer id; 
} 

Disons que j'ai quelques entrées dans l'entité de calendrier pour les dates 2017-10-5, 2017-10-6, 2017-10-7, 2017-10-8 avec room_id = 10.

Je veux construire une requête de sorte que si l'utilisateur demande une pièce avec un certain checkin et date de paiement, alors il obtiendra la bonne liste des chambres.

Comment puis-je faire cela?

Par exemple, l'utilisateur demande la pièce avec checkin = 2017-10-6 et checkout = 2017-10-8 et la pièce doit apparaître dans la liste.

Quelle devrait être la requête pour obtenir la bonne liste des pièces?

MISE À JOUR:

La requête que j'ai pour vérifier maintenant que si la chambre est disponible à la date de checkin et la date de départ, mais pas entre:

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

Je ne pense pas que ce soit la même chose. Ce que je veux, c'est de vérifier si chaque date de la date d'arrivée jusqu'à la date de départ est disponible. Et si c'est le cas, obtenez le room_id. – peterthunder

+0

La réponse à votre question est une petite variation à la question que j'ai référencée, tout ce que vous devez faire est d'utiliser une sous-requête avec 'NOT EXISTS' ... – crizzis

Répondre

1

Une approche est la suivante: SELECT count (c.calendarId.room_id), c.calendarId.room_id FROM CalendarEntity c WHERE c.available = true et c.calendarId.date BETWEEN: checkin et: checkout GROUP BY c.calendarId.room_id HAVING count (c.calendarId.room_id)> =: noOfDays noODays indique les jours calculés à partir des dates d'arrivée et de départ pour lesquelles la réservation est requise.

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