postgresql 如何使用Spring Webflux从数据库中提取数据并将其删除?

s3fp2yjn  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(198)

删除操作不起作用。我如何提取数据,然后删除它的功能方式?代码成功运行,但它不是删除数据库中的数据。

控制器类

@DeleteMapping("/deleteUserById/{userId}")
    public Mono<ResponseEntity<String>> deleteUserById(@PathVariable Long userId) {
        return userService.deleteUserById(userId);
    }

用户服务类

@Override
    public Mono<ResponseEntity<String>> deleteUserById(Long userId) {
        return userRepository.findById(userId)
                .map(user -> {
                    UserDto deletedUser = UserMapper.USER_MAPPER_INSTANCE.toUserDto(user);
                    return "User: " + deletedUser.getUsername() + " deleted!";
                })
                .doOnNext(user -> {
                    userRepository.deleteUserById(userId);
                })
                .map(ResponseEntity::ok)
                .defaultIfEmpty(ResponseEntity
                      .status(HttpStatus.NOT_FOUND)
                      .body("UserId: " +       userId + " Not found"));

   }

存储库接口

@EnableR2dbcRepositories
public interface UserRepository extends ReactiveCrudRepository<User, Long> {

    @Query("SELECT * FROM tb_user WHERE username LIKE $1")
    Mono<User> findByUsername(String username);

    @Query("DELETE FROM tb_user WHERE userid = $1")
    Mono<User> deleteUserById(Long userId);

}

Postgres表

警报系统=#从tb_用户选择 *;
用户识别码|用户名|姓名|电子邮件|密码|pH值|出生日期|角色
-——————-+-————————-+-—————————————-+-——————————————————————————-+-————————-+-——————————-+-—————————————-+-—————-

5 | am0007   | Ajay Maharjan | ajay007@gmail.com | asdfgh1  | 558955697 | 1999-05-21    | ADMIN

输出

    • 案例:用户ID不可用**
UserId: 3 Not found
    • 案例:可用用户ID**
User: am0007 deleted!

我正在尝试以被动方式删除数据库中的数据。我获得了预期的输出,但删除操作不起作用。

vsmadaxz

vsmadaxz1#

这是因为deleteUserById()是一个被动操作,它返回Mono,但是你在doOnNext()方法中调用它,所以没有人订阅它。记住规则:在您订阅之前不会发生任何事情
问题是doOnNext()只是为了添加一些副作用,例如,记录一些东西。
应该在flatMap()运算符内调用delete方法

.flatMap(user -> {
    userRepository.deleteUserById(userId);
})

因此,下游订阅从该flatMap返回的Mono

xmd2e60i

xmd2e60i2#

尽管声明了Mono<User>,但deleteUserById()返回了mono<Void>。因此,我所做的是,将其更改为Mono<Void>,然后添加.thenReturn(user),后者从flatMap返回Mono<User>

return userRepository.findById(userId)
            .flatMap(user -> userRepository.deleteUserById(userId).thenReturn(user))
            .map(user -> {
                log.info("Deleted User: {}", user);
                return ResponseEntity.status(HttpStatus.OK).body("User: " + user.getUsername() + " deleted!");
            })
            .defaultIfEmpty(ResponseEntity.status(HttpStatus.NOT_FOUND).body("UserId: " + userId + " Not found"));

相关问题