jpa HQL期望java.time.duration,即使方法头和用法建议LocalDateTime

rjee0c15  于 2023-01-26  发布在  Java
关注(0)|答案(1)|浏览(123)

我在JpaRepository中编写一个查询,它不接受字符串和3个LocalDateTimes作为参数。在查询中,我首先比较字符串,就像比较ID一样,然后使用相应实体的不同列,使用Hibernate 6的适当操作符创建LocalDateTimes。
应用程序正常启动,但当我调用查询时,我得到以下错误:

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和Sping Boot 3.0.1以及Java 17

x4shl7ld

x4shl7ld1#

这是新参数类型推理逻辑中的一个bug。我可以用下面的查询重现:

session.createQuery("select :dt + 1 day")
        .setParameter("dt", LocalDateTime.now())
        .getSingleResult();

我在此为您打开了一个问题:https://hibernate.atlassian.net/browse/HHH-16102

相关问题