Spring boot - для выполнения оператора SQL обновления (JPA) - PullRequest
0 голосов
/ 18 мая 2018

Я только что начал с Spring Boot, и я тренируюсь в базе с этим примером: http://www.devglan.com/spring-boot/spring-boot-angular-example

Физическое удаленное работает нормально, но я пытаюсь сделать логическое удаление, и я не знаюкак это сделать.

Это мои занятия:

UserController

@DeleteMapping(path ={"logical/{id}"})
public User deleteLogical(@PathVariable("id") int id, @RequestBody User user) {
    return userService.deleteLogical(id, user);
}

UserService

User deleteLogical(int id, User user);

UserServiceImpl

@Override
// @Query("update user set remove = false where id = ?1")
public User deleteLogical(int id, User user) {
    // user.setRemove(false);
    return repository.save(user);
} 

UserRepository

User save(User user);

Это оператор SQL, который я хочу выполнить:

UPDATE user SET remove = false WHERE id =?;

Как я мог это сделать?Спасибо,

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вы пытаетесь реализовать «мягкое удаление», чтобы попробовать этот подход:

Пользовательский объект :

@Entity
User {
    @Id
    @GeneratedValue
    private Integer id;

    //...

    private boolean removed; // user is removed if this property is true

    //...
}

Пользовательский сервис :

public interface UserService {   
    Optional<Integer> softDelete(int id);
}

@Service    
public UserServiceImpl implements UserService (

   // Injecting UserRepo

   // First variant - read the user, set it removed, then updated it.
   @Transactional
   Optional<Integer> softDelete1(int id) {
       // Using method findById from Spring Boot 2+, for SB1.5+ - use method findOne 
       return userRepo.findById(id).map(user -> {
           user.setRemoved(true); 
           userRepo.save(user);
           return 1;
       });
   }

   // Second variant - update the user directly
   @Transactional
   Optional<Integer> softDelete2(int id) {
       return userRepo.softDelete(id);
   }
}

Пользовательский контроллер :

@RestController
@RequestMapping("/users")
public class UserController {

   // Injecting UserService

   @DeleteMapping("/{id}")
   public ResponseEntity<?> softDelete(@PathVariable("id") int id) {
        return userService.softDelete1(id) // you can use 1 or 2 variants 
            .map(i -> ResponseEntity.noContent().build()) // on success
            .orElse(ResponseEntity.notFound().build()); // if user not found
   }
}

Пользовательское репо :

public interface UserRepo extends JpaRepository<User, Integer>() {
    @Modifying(clearAutomatically = true)
    @Query("update User u set u.removed = true where u.id = ?1")
    int remove(int id);

    default Optional<Integer> softDelete(int id) {
        return (remove(id) > 0) ? Optional.of(1) : Optional.empty();
    }
}

ОБНОВЛЕНО

Или, я думаю, вы можете просто попытаться просто переопределить deleteById метод CrudRepository (не тестировался - пожалуйста, оставьте отзыв):

@Override
@Modifying(clearAutomatically = true)
@Query("update User u set u.removed = true where u.id = ?1")
void deleteById(Integer id);

затемиспользуйте это в своем сервисе.

0 голосов
/ 18 мая 2018

Я думаю, вам не нужно передавать объект User.Ид будет достаточно.

Таким образом, ваш код будет изменен

@DeleteMapping(path ={"logical/{id}"})
public User deleteLogical(@PathVariable("id") int id) {
    return userService.deleteLogical(id, user);
}

UserService

User deleteLogical(int id);

UserServiceImpl

@Override
public User deleteLogical(int id) {
    User user = repository.findById(id);
    user.setRemove(true);
    return repository.save(user);
} 

Вот и все.

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