JPA +休眠currentTimestamp()与预期类型不匹配

时间:2018-11-28 21:43:11

标签: hibernate jpa kotlin criteria

我有以下引发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的currentTimestamp()引起的。在QueryParameterBindingValidator的Hibernate的validate(Type paramType, Object bind, TemporalType temporalType)中,有这行

final Class parameterType = paramType.getReturnedClass();

实体的deletedOn类型为TimestampparamType指向该字段,类型为TimestampType(来自Hibernate)。调用getReturnedClass()时,它返回java.util.Date(我想是因为这是基本类型吗?)。不幸的是,然后类型cb.currentTimestamp()出现类型不匹配,并引发了错误。

在网上找不到有效的示例,说明如何使用CriteriaBuilder中的currentTimestamp()完成此任务。

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

我发现使用此行将使其正常工作。

query.set(updateEntity.get<Timestamp>("deletedOn"), cb.currentTimestamp())