【问题标题】:How to perform update operation using CriteriaUpdate in sping Data JPA?如何在 Spring Data JPA 中使用 CriteriaUpdate 执行更新操作?
【发布时间】:2020-05-09 11:06:39
【问题描述】:

作为 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?

【问题讨论】:

  • 你看到这个答案了吗? stackoverflow.com/a/48504562/11733759你可以用entityManager.createQuery(update)来做
  • 请不要对非引用段落使用引用格式。我为你更正了。

标签: java jpa spring-data-jpa spring-data criteria-api


【解决方案1】:

基于this answer,您可以这样做:

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();

【讨论】:

    猜你喜欢
    • 2021-11-10
    • 2020-03-13
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2018-09-24
    • 2014-03-01
    相关资源
    最近更新 更多