代码之家  ›  专栏  ›  技术社区  ›  Stefan Zhelyazkov

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

  •  0
  • Stefan Zhelyazkov  · 技术社区  · 6 年前

    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 validate(Type paramType, Object bind, TemporalType temporalType) 有这条线

    final Class parameterType = paramType.getReturnedClass();
    

    实体的 deletedOn Timestamp paramType 指该字段,类型为 TimestampType (来自冬眠)。什么时候 getReturnedClass() 被调用,它返回 java.util.Date (我猜是因为这是基本类型?)。不幸的是,表达式中出现了类型不匹配 cb.currentTimestamp() 然后抛出错误。

    我在网上找不到如何使用的工作示例 currentTimestamp() 从CriteriaBuilder来完成此任务。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Stefan Zhelyazkov    6 年前

    我发现使用这条线可以使它工作。

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