Я пишу запрос в JpaRepository, который принимает String и 3 LocalDateTimes в качестве параметров. В запросе я сначала сравниваю строку как идентификатор, а затем использую другой столбец соответствующего объекта для создания LocalDateTimes с использованием соответствующих операторов для Hibernate 6.
Приложение запускается нормально, но когда я вызываю запрос, я получаю следующую ошибку:
Argument [2023-01-23T11:43:59] of type [java.time.LocalDateTime] did not match parameter type [java.time.Duration (n/a)]
Аргумент, очевидно, был правильно проанализирован Restcontroller, но Hibernate, похоже, не создает запрос, как ожидалось.
Ниже приведен код репозитория и рассматриваемого запроса:
public interface ExchangePairRepository extends JpaRepository<MyEntity, Long> {
@Query("SELECT ep.unit FROM MyEntity ep WHERE ep.id= :id AND ((ep.context = 'start' AND ((ep.unit = 'day' AND (:start+ ep.duration day) > :now) "
+ "OR (ep.unit = 'month' AND (:start+ ep.duration month) > :now))) OR (ep.context = 'end' AND ((ep.unit = 'day' AND (:now + ep.duration day) > :end) "
+ "OR (ep.unit = 'month' AND (:now + ep.duration month) > :end)) ))")
List<String> findViable(@Param("matNrOrig") String id, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
@Param("now") LocalDateTime now);
}
Ниже приведен объект, который я использую для запроса:
@Entity
@Table(name = "my_entity")
@Data
public class MyEntity{
(...)
@Column(name = "id_orig")
private String idOrig;
´
@Column(name = "id_target")
private String idTarget;
@Column(name = "context")
private String context;
@Column(name = "duration")
private int duration;
@Column(name = "unit")
private String unit;
}
Это баг или я что-то не так делаю? Буду признателен за любую оказанную помощь.
Я использую Hibernate 6.1.6.Final и Spring Boot 3.0.1 с Java 17.
Редактировать:
Приведение параметров в запрос решило проблему на данный момент, хотя выглядит это не очень красиво. Я просто подожду, когда ошибка будет исправлена в одном из следующих релизов.
Это ошибка в новой логике вывода типа параметра. Я могу воспроизвести только этот запрос:
session.createQuery("select :dt + 1 day")
.setParameter("dt", LocalDateTime.now())
.getSingleResult();
Я открыл для вас вопрос здесь: https://hibernate.atlassian.net/browse/HHH-16102
ОБНОВЛЯТЬ
Следующий обходной путь очень уродлив, но работает:
session.createQuery("select cast(:dt as LocalDateTime) + 1 day")
.setParameter("dt", LocalDateTime.now())
.getSingleResult();
Теперь, когда вы спрашиваете, я только что подумал об одном. (Обновил ответ.)
Ах, большое спасибо. Есть ли обходной путь на данный момент? Думаю, я буду продолжать ждать новой версии и пока делать расчеты в java.