JPA + Hibernate currentTimestamp () не соответствует ожидаемому типу - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий код, который выдает 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 для решения этой задачи.

Любая помощь будет принята с благодарностью!Спасибо!

1 Ответ

0 голосов
/ 25 января 2019

Я обнаружил, что с помощью этой строки она заработает.

query.set(updateEntity.get<Timestamp>("deletedOn"), cb.currentTimestamp())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...