#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);
}