сравнить даты в 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 шт):
Не создавайте строку запроса вклеивая в нее аргументы. Это плохо и точки зрения безопасности и приводит вот к таким проблемам, когда нужно задумываться о точном представлении даты в виде строки.
Вместо этого используйте именованные параметры:
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);