У меня есть следующий код, который выдает 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()
}
Ошибка возникает из-за того, что я использую CriteriaBuilder's currentTimestamp()
.В QueryParameterBindingValidator
в validate(Type paramType, Object bind, TemporalType temporalType)
Hibernate есть эта строка
final Class parameterType = paramType.getReturnedClass();
deletedOn
сущности имеет тип Timestamp
.paramType
относится к этому полю и относится к типу TimestampType
(происходит из Hibernate).Когда вызывается getReturnedClass()
, возвращается java.util.Date
(наверное, потому что это базовый тип?).К сожалению, тогда возникает несоответствие типов с выражением cb.currentTimestamp()
, и выдается ошибка.
Я не смог найти в сети работающий пример того, как использовать currentTimestamp()
из CriteriaBuilder для решения этой задачи.
Любая помощь будет принята с благодарностью!Спасибо!