HQL ожидает java.time.duration, хотя заголовок метода и использование предполагают LocalDateTime

Я пишу запрос в 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.

Редактировать:

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

1
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ошибка в новой логике вывода типа параметра. Я могу воспроизвести только этот запрос:

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.

Marpleg 26.01.2023 01:43

Теперь, когда вы спрашиваете, я только что подумал об одном. (Обновил ответ.)

Gavin King 26.01.2023 08:09

Другие вопросы по теме