сравнить даты в hql запросе

У меня есть таблица в mysql с колонками

start_date DATE NOT NULL,
end_date   DATE NOT NULL

В java создается объект сущность с полями типа java.util.Date;

 @Column(name = "start_date")
    private Date startDate;

 @Column(name = "end_date")
    private Date endDate;

в репозитории данного объекта я хочу получить запись которая будет соответствовать условию: startDate <= endDate; Пытаюсь получать это так:

tempBooking = (Booking) session
    .createQuery("FROM Booking where roomId = " + booking.getRoomId() + " and userId = "
        + booking.getUserId() + " and startDate = '"
        + booking.getStartDate()
        + "' and endDate = '"
        + booking.getEndDate()
        + "' and startDate <= endDate")
     .getResultList().stream().findFirst().orElse(null);

Конечно же, он не работает. Я думаю это из за того, что формат даты неверный, т.к. Date в java возвращает запись типа Wen Mar 05 00:00:00 MSK 2003 а в таблице значения выглядят так: 2003-03-05 Как мне можно привести значения к общему формату для того чтобы суметь их сравнить?


Ответы (1 шт):

Автор решения: Roman Konoval

Не создавайте строку запроса вклеивая в нее аргументы. Это плохо и точки зрения безопасности и приводит вот к таким проблемам, когда нужно задумываться о точном представлении даты в виде строки.

Вместо этого используйте именованные параметры:

String hql = "FROM Booking where roomId = :roomId and "
        +  "userId = :userId and startDate = :startDate"
        + " and endDate = :endDate"
        + " and startDate <= endDate");
Query query = session.createQuery(hql);

query.setParameter("roomId", booking.getRoomId());
query.setParameter("userId", booking.getUserId());
query.setParameter("startDate", booking.getStartDate());
query.setParameter("endDate", booking.getEndDate());

tempBooking = (Booking)query.getResultList().stream().findFirst().orElse(null);
→ Ссылка