Как выполнять запросы типа «SET SQL_SAFE_UPDATES = 0» с JPA - PullRequest
1 голос
/ 18 октября 2019

Я хочу выполнить этот запрос в своем весеннем настольном приложении

SET SQL_SAFE_UPDATES = 0;

Это должен быть запрос GET или запрос PUT? Я пробовал оба, но безуспешно. В настоящее время я пытаюсь

@GetMapping("/orderbook/safeMode")
    private void setSafeMode() {
        orderBookRepository.setSafeMode();
    }
@Query(value = "SET SQL_SAFE_UPDATES = 0;", nativeQuery = true)
    void setSafeMode();

Но выдает ошибку

2019-10-18 11:38:37.844 ERROR 12112 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : ResultSet is from UPDATE. No Data.
2019-10-18 11:38:37.851 ERROR 12112 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not execute query; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query] with root cause

java.sql.SQLException: ResultSet is from UPDATE. No Data.

любые предложения, пожалуйста

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Это работало путем добавления аннотаций @Modifying и @Transactional к методу репозитория

@Modifying
@Transactional
@Query(value = "SET SQL_SAFE_UPDATES = 0;", nativeQuery = true)
void setSafeMode();

Спасибо Nikolay Shevchenko за предложение @Modifying аннотации

Важные ссылки, чтобы узнать больше

Нужны ли нам аннотации @Transaction и @Modifying в Spring?

почему мы должны использовать аннотацию @Modifying для запросов в данных Jpa

0 голосов
/ 18 октября 2019

Вот правильный поток для обновления объекта в БД с использованием Spring Data:

// first go get that object by id, ex :
OrderBook orderBook = orderBookRepository.findById(1);
// 
if (orderBook != null) {
    orderBook.setSafeMode(0); // setter
    orderBookRepository.save(orderBook); // updating if object already have id and the id is existed in DB or will save new object if there are no id existed in DB.
}

EDIT Если вы найдете способ заблокировать объект для обновления с помощью Spring Data JPA

PESSIMISTIC_READ - позволяет нам получить общую блокировку и предотвратить обновление или удаление данных

@Lock(LockModeType.PESSIMISTIC_READ)
public Optional<OrderBook> findById(Long id); // override

Когда вы сначала вызываете orderBookRepository.findById (1), затем другие могут 'не обновлять его, пока вы не зафиксируете этот объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...