Как выполнить операцию обновления с использованием CriteriaUpdate в sping Data JPA? - PullRequest
0 голосов
/ 23 января 2020

Поскольку данные пружины 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); Теперь я хочу выполнить операцию обновления, используя критерии обновления в данных пружины 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 не может быть преобразован в предикат простой способ реализовать CriteriaUpdate, а затем напрямую передать экземпляр в метод Repository, как в операции Get, у нас есть метод findAll()?

или есть какой-либо другой лучший способ для реализации critUUpdate весной Data JPA?

1 Ответ

0 голосов
/ 23 января 2020

На основании этого ответа вы можете сделать так:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...