Я пытаюсь передать параметр java.time.LocalDate
в именованный запрос, но Hibernate ошибочно ожидал параметр типа java.util.Date
. Я использую Java 8 в Spring Boot 2.2.5 (с Hibernate 5.4.12 и JPA 2.2.5).
Исключение:
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...
}
Я думаю, что проблема (ошибка?) Заключается в именованном запросе, где приведение от Timestamp
к Date
генерирует тип java.util.Data
. Фактически, если я запрашиваю другую сущность с параметром типа LocalDate
для атрибута того же типа, он работает как ожидалось.
Однако я решил эту проблему, передав java.sql.Date.valueOf(date)
в качестве параметра, но я хочу знать, почему Hibernate не разрешил LocalDate
, как я ожидал.