неожиданный токен: — рядом со строкой 1 в запросе JPA

#java #spring #spring-boot #jpa #spring-data-jpa

Вопрос:

я использую spring boot JPA вот мой запрос на обновление выглядит так

  @Query("update employee set sal=  sal- 1000  where salary > :sal")
 void updateSalary(@Param("sal") Long sal)
 

Способ обслуживания

  List<Employee> updateSalary(Long sal){
   repo.updateSalary(10000l);
   return repo.findAll();
 }
 

Почему-то JPA не в состоянии понять - характер.

Комментарии:

1. сначала, пожалуйста, скажите мне, есть ли у вас уровень обслуживания ? и, возможно, вам нужно обновить сотрудника по идентификатору uniq, например id

2. @edhi.uchiha да, есть уровень обслуживания, и я хочу обновить зарплату всех сотрудников на основе sal, скажем, >10000

3. Можете ли вы показать мне код сервисного уровня ?

4. обновите сотрудника e установите e.sal = e.sal — 1000, где e.зарплата > :sal

5. Или так и должно быть @Query("update employee set salary = salary - 1000 where salary > :sal")

Ответ №1:

Ваш запрос должен быть

 @Query("update Employee e set e.salary = e.salary-1000 where e.salary > :arg")
 

Также вы должны пометить метод репозитория с @Transactional помощью и @Modifying , и тип возвращаемого значения всегда должен быть void .

Полный код:

 @SpringBootApplication
public class SpringBootMysqlApplication implements CommandLineRunner {
    @Autowired
    EmployeeRepository employeeRepository;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMysqlApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        if (employeeRepository.count() == 0) {
            List<Employee> employees = List.of(
                    new Employee(null, "Josh", 1800L),
                    new Employee(null, "John", 800L),
                    new Employee(null, "Nina", 1500L),
                    new Employee(null, "Nate", 400L)
            );

            employeeRepository.saveAll(employees);
        }
    }


    @RestController
    @RequestMapping("/hello")
    public static class HelloController {

        @Autowired
        EmployeeRepository employeeRepository;

        @GetMapping(path = "/")
        public Map<String, String> update() {
            employeeRepository.updateSalary(1000L);
            return Map.of("status", "success");
        }

        @GetMapping(path = "/all")
        public Map<String, Object> all() {
            return Map.of("status", "success", "employees", employeeRepository.findAll());
        }
    }
}
 

Хранилище:

 @Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Transactional
    @Modifying
    @Query("update Employee e set e.salary = e.salary-1000 where e.salary > :arg")
    void updateSalary(@Param("arg") Long arg);

}