У меня есть следующий код, который выдает java.lang.IllegalArgumentException: Parameter value [org.hibernate.query.criteria.internal.expression.function.CurrentTimestampFunction@30cb223b] did not match expected type [java.util.Date (n/a)]
@Transactional
open fun delete(entity: E) {
val cb = em.criteriaBuilder
// create update query
val query = cb.createCriteriaUpdate(Entity::class.java)
val updateEntity = query.from(Entity::class.java)
// set update and where clause
query.set("deletedOn", cb.currentTimestamp()) // <- problem exhibited due to this line
query.where(cb.equal(updateEntity.get<Long>("id"), entity.id))
// perform update
em.createQuery(query).executeUpdate()
}
Ошибка возникает из-за того, что я использую currentTimestamp() CriteriaBuilder. В QueryParameterBindingValidator Hibernate в validate(Type paramType, Object bind, TemporalType temporalType) есть эта строчка
final Class parameterType = paramType.getReturnedClass();
deletedOn объекта относится к типу Timestamp. paramType относится к этому полю и относится к типу TimestampType (происходит от Hibernate). Когда вызывается getReturnedClass(), он возвращает java.util.Date (я думаю, потому что это базовый тип?). К сожалению, тогда возникает несоответствие типов с выражением cb.currentTimestamp(), и возникает ошибка.
Мне не удалось найти в сети рабочий пример того, как использовать currentTimestamp() из CriteriaBuilder для решения этой задачи.
Любая помощь будет оценена по достоинству! Спасибо!





Я обнаружил, что использование этой строки заставит ее работать.
query.set(updateEntity.get<Timestamp>("deletedOn"), cb.currentTimestamp())
Правильный синтаксис ромба -
updateEntity.<Timestamp>get("deletedOn").