Как получить указанные поля из объекта, чтобы проверить, если список содержит () объект?Проблема с подтверждением бронирования номера - PullRequest
0 голосов
/ 16 мая 2019

Вот моя сущность:

 @Entity
@Table(name = "reservation")
public class Reservation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "date_in")
    private LocalDate dateIn;

    @Column(name = "date_out")
    private LocalDate dateOut;

    @ManyToOne
    private Guest guest;

    @ManyToOne
    private Room room;

    public Reservation() {
    }

    public Reservation(LocalDate dateIn, LocalDate dateOut, Guest guest, Room room) {
        this.dateIn = dateIn;
        this.dateOut = dateOut;
        this.guest = guest;
        this.room = room;
    }

    public Guest getGuest() {
        return guest;
    }

    public void setGuest(Guest guest) {
        this.guest = guest;
    }

    public Room getRoom() {
        return room;
    }

    public void setRoom(Room room) {
        this.room = room;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public LocalDate getDateIn() {
        return dateIn;
    }

    public void setDateIn(LocalDate dateIn) {
        this.dateIn = dateIn;
    }

    public LocalDate getDateOut() {
        return dateOut;
    }

    public void setDateOut(LocalDate dateOut) {
        this.dateOut = dateOut;
    }

    @Override
    public String toString() {
        return "Reservation{" +
                "id=" + id +
                ", dateIn=" + dateIn +
                ", dateOut=" + dateOut +
                ", guest=" + guest +
                ", room=" + room +
                '}';
    }
}

Вот мой метод проверки:

@ Override Общественное бронирование сохранить (Резервирование бронирования) { validateDate (booking.getDateIn (), booking.getDateOut ());

        List<ReservationRepository> bookedRooms = reservationRepository.findBookedRooms();

        if (!bookedRooms.contains(reservation)) {
            return reservationRepository.save(reservation);
        }
        return null;
    }

findBookedRooms () получает этот SQL-запрос:

@Query(value = "SELECT rs.room_id, rs.date_in, rs.date_out FROM reservation rs LEFT JOIN room r ON rs.room_id = r.id WHERE rs.id IS NOT NULL", nativeQuery = true)
    List<ReservationRepository> findBookedRooms();

ПРОБЛЕМА: В операторе if bookedRooms получает список параметров :servation.room_id ,servation.date_in ,servation.date_out, а объект резервирования получает :servation.id ,servation.date_in ,servation.date_out. В результате у нас возникает конфликт rs.room_id - rs.id, поэтому «оператор if» всегда будет истинным. Как я могу сделать свой объект резервирования, чтобы получить следующие конкретные параметры :servation.getRoom (). GetNumber (), booking. date_in, reservation.date_out

Мне нужна эта проверка, чтобы проверить, нет ли противоречий в датах при бронировании определенного номера.

1 Ответ

0 голосов
/ 16 мая 2019

Ваша проверка состоит в использовании метода contains из списка, полученного из БД, с проверкой: «список содержит это резервирование?».

Ваш вопрос в основном говорит о том, что оператор IF всегда оценивается как true, поэтому он всегда оценивает: «этого резервирования нет в списке!»

Учитывая все это, я считаю, что вы должны проверить, как работает метод contains в интерфейсе List. Эта запись имеет некоторое представление об этом.

Метод contains использует метод equals, чтобы проверить, есть ли у объекта равный объект в списке. Поскольку оба используемых типа различаются (ReservationRepository не совпадает с Reservation), он не будет работать 100% времени, если только вы не начнете переопределять метод equals (учитывая, что вы используете два типа для сравнения, я бы предупредил вас, не делай этого).

Возможное решение:

Просмотрите список и внутри цикла проверьте поля, необходимые для оценки, если резервирование уже существует в базе данных тура. Сделайте это внутри вашего метода сохранения или напишите другой метод для лучшей организации кода.

Цикл, вероятно, будет выглядеть так:

boolean reservationExists = false;
for(ReservationRepository r:bookedRooms){
     if (r.getRoom().equals(reservation.getRoom()) &&
        r.getDateOut().equals(reservation.getDateOut()) &&
        r.getDateIn().equals(reservation.getDateIn())) {
            reservationExists = true;
            break;
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...