gpt4 book ai didi

java - java.time.LocalDate 参数在 hibernate 查询中作为 java.util.Date 处理

转载 作者:行者123 更新时间:2023-12-02 10:46:56 26 4
gpt4 key购买 nike

我试图将 java.time.LocalDate 参数传递给命名查询,但 Hibernate 错误地期望 java.util.Date 类型的参数。 我在 Spring Boot 2.2.5 上使用 Java 8(使用 Hibernate 5.4.12 和 JPA 2.2.5)。

异常(exception):

    Exception - org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [2020-03-30] did not match expected type [java.util.Date (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [2020-03-30] did not match expected type [java.util.Date (n/a)]

DAO方法:

java.time.LocalDate date = LocalDate.now(); // example date
result = entityManager.createNamedQuery("MyTableEntity.query", MyTableEntity.class)
.setParameter("date", date)
.setMaxResults(1)
.getSingleResult();

命名查询:

@NamedQuery(name = "MyTableEntity.query", query = "SELECT o FROM MyTableEntity o WHERE date(o.timestamp) = :date")

实体:

@Entity
@Table(name = "my_table")
public class MyTableEntity implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@Column(name = "time_control")
private java.time.OffsetDateTime timestamp;

private static final long serialVersionUID = 1L;

// constructors...
// getters and setters...
}

我认为问题(bug?)出在命名查询中,其中从 TimestampDate 的转换生成 java.util.Data 类型。事实上,如果我在相同类型的属性上使用 LocalDate 类型参数查询另一个实体,它会按预期工作。

但是我通过传递 java.sql.Date.valueOf(date) 作为参数解决了这个问题,但我想知道为什么 Hibernate 没有按照我的预期解析 LocalDate .

最佳答案

您在 hql/jpql 查询中使用的每个函数都应该在您使用的 hibernate 方言中声明。在您的情况下,date 函数的声明看起来像这样:

import org.hibernate.type.StandardBasicTypes;

public YourDialect {

// ...
registerFunction( "date", new StandardSQLFunction( "date", StandardBasicTypes.DATE ) );

}

下面您可以看到StandardBasicTypes.DATE是如何定义的:

/**
* The standard Hibernate type for mapping {@link java.util.Date} ({@link java.sql.Date}) to JDBC
* {@link java.sql.Types#DATE DATE}.
*
* @see TimeType
*/
public static final DateType DATE = DateType.INSTANCE;

这就是您在问题异常(exception)中提到的原因。您可以通过按以下方式重新定义 date 函数来更改此设置:

import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.LocalDateType;

public class MyDialect extends SomeHibernateDialect
{
public MyDialect()
{
super();
registerFunction( "date", new StandardSQLFunction( "date", LocalDateType.INSTANCE ) );
}
}

然后使用这个方言。之后,您的初始查询将起作用。

关于java - java.time.LocalDate 参数在 hibernate 查询中作为 java.util.Date 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60934427/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com