如何使用CriteriaUpdate进行更新操作?

问题描述 投票:0回答:1

Spring Data JPA 提供了获取结果的规范,如下所示:

public static Specification<Customer> customerHasBirthday() {
    return new Specification<Customer> {
        public Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb) {
            return cb.equal(root.get(Customer_.birthday), today);
        }
    };
}

然后我们可以在存储库方法中传递上述规范

customerRepository.findAll(customerHasBirthday);
现在我想使用Spring Data JPA中的标准更新来执行更新操作,如下所示

public static Specification<Customer> upadteCustomerName() {
    return new Specification<Customer> {
        public Predicate toPredicate(Root<Customer> root, CriteriaQuery query, CriteriaBuilder cb) {
            CriteriaUpdate<Customer> update = cb.createCriteriaUpdate(Customer.class)
            update.set("name", "newName");
            return update.where(cb.greaterThanOrEqualTo(root.get("id"), 2));
        }
    };
}

显然我会得到编译时错误

CriteriaUpdate 无法转换为谓词

Spring Data JPA 是否提供了任何简单的方法来实现

CriteriaUpdate
,然后直接将实例传递给 Repository 方法,就像在 Get 操作中我们有
findAll()
方法一样?

或者还有其他最好的方法在 Spring Data JPA 中实现

criteriaUpdate
吗?

java jpa spring-data-jpa spring-data criteria-api
1个回答
1
投票

基于这个答案你可以这样做:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaUpdate<Customer> q = cb.createCriteriaUpdate(Customer.class);
Root<Customer> root = q.from(Customer.class);
q.set(root.get("name"),  "newName")
        .where(cb.greaterThanOrEqualTo(root.get("id"), 2)); 

int result = em.createQuery(q).executeUpdate();
© www.soinside.com 2019 - 2024. All rights reserved.