Hibernate没有在CriteriaUpdate中调用UserType for null-value

时间:2015-03-13 09:41:48

标签: java hibernate jpa hibernate-4.x jpa-2.1

Hibernate使用类来表示文字:

  • org.hibernate.jpa.criteria.expression.LiteralExpression
  • org.hibernate.jpa.criteria.expression.NullLiteralExpression

第一个将占位符放入查询并将UserType应用于该值,第二个将简单地将null放入查询中,从而忽略任何已配置的UserTypeCriteriaUpdateImpl如果将NullLiteralExpression作为第二个参数传递给nullset(Path<Y>, X)拒绝CriteriaBuilderImpl.literal(T),则null会选择UserType

我们使用Calendar存储null - 对象作为AES加密的日期字符串,并且出于兼容性原因,强制将CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaUpdate<Entity> criteriaUpdate = criteriaBuilder.createCriteriaUpdate(Entity.class); Root<Entity> root = criteriaUpdate.from(Entity.class); criteriaUpdate.where(criteriaBuilder.equal(root.get("id"), id)); setPathToNull((CriteriaBuilderImpl) criteriaBuilder, criteriaUpdate, root.get("value")); Query query = entityManager.createQuery(criteriaUpdate); LOG.info("About to perform 2. update"); LOG.info("Updated " + query.executeUpdate() + " entities"); - 值替换为0长度数据。

所以问题是,是否有任何方法只使用带有Hibernate-backend的JPA-API来归档以下内容,因为这真的很难看

private <Y> CriteriaUpdate<Entity> setPathToNull(CriteriaBuilderImpl criteriaBuilder, CriteriaUpdate<Entity> criteriaUpdate, Path<Y> value) {
    return criteriaUpdate.set(value, new LiteralExpression<>(criteriaBuilder, (Y)null));
}

助手:

String

提供了一个完整的工作示例 https://github.com/TheConstructor/NullUpdate/tree/master/src/main/java/tc/vom

您可能会想出其他访问该属性的方法,但属性名称是{{1}},并且事先无法加载该实体,因为此更新是读取值错误的一部分 - 清理。如果列的名称对您有帮助,也可以使用它。

0 个答案:

没有答案