簡體   English   中英

Spring R2DBC DatabaseClient 在 PostgreSQL 執行自定義刪除查詢

[英]Spring R2DBC DatabaseClient execute custom delete query in PostgreSQL

您好我正在嘗試通過他的 id 從 Postgres 數據庫中的表中刪除用戶。 我使用 Spring 和 R2DBC 並嘗試將DatabaseClient.execute("sqlCommand")用於我的自定義刪除查詢:

import org.springframework.data.r2dbc.core.DatabaseClient;

@Service
@Transactional
public class CustomSqlService {
    private final DatabaseClient databaseClient;


  public Mono<Void> deleteWithCustomSql(String sql) {
            databaseClient.execute(sql)
            return Mono.empty();
    }

其中sql"DELETE FROM user_table WHERE user_id = 1;"

Controller中的方法:


@RestController
@RequestMapping("postgres/")
@Timed
public class PostgresController {

// omitted code


   @DeleteMapping(path = "/delete_user/{userId}")
    public Mono<Void> deleteUser(@PathVariable("userId") Long userId)  {
       return customSqlService.deleteWithCustomSql("DELETE FROM user_table WHERE user_id = " + userId);
    }

但是當我測試它時,命令不起作用。 當我調試時,我可以看到.execute()的結果中有MonoOnResumeError

我有其他方法以相同的方式執行insertselect語句,它們運行良好。

我對它的測試:

 @Test
    void shouldDeleteDataFromTable() {
        User user = User.builder()
                .userId(1L)
                .sessionId(2L)
                .timestamp(10L)
                .build();

        webTestClient
                .post()
                .uri("/postgres/save_user")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .body(Mono.just(user), User.class)
                .exchange()
                .expectStatus().isOk()

     webTestClient
             .delete()
             .uri("/postgres/delete_user/1")
             .exchange()
             .expectStatus()
             .isOk();
      
        userRepository.findAll().take(1).as(StepVerifier::create)
                .expectNextCount(0)
                .verifyComplete();

如何在 PostgreSQL 中正確使用databaseClient.execute()進行自定義刪除查詢?

希望您使用的是最新的 R2dbc 1.0 和 Spring Data R2dbc(由 Spring Boot 3.0 管理)。

您的方法deleteWithCustomSql不起作用。 沒有對databaseCLient.exectue的訂閱,永遠不會執行 sql 並返回結果。

嘗試改成如下,把sql移到這里,使用bind給sql綁定一個參數。

 public Mono<Long> deleteByUserId(Long userId) {
     return databaseClient.sql("DELETE FROM user_table WHERE user_id = :userId")
         .bind("userId", userId)
         .fetch()
         .rowsUpdated();
}

在controller,改成如下。

@DeleteMapping(path = "/users/{userId}")
public Mono<ResponseEntity> deleteUser(@PathVariable("userId") Long userId)  {
    return customSqlService.deleteByUserId(userId)
        .map(deleted -> {
            if(deleted>0) return noContent().build();
            else return notFound().build();
         });
}

查看我delete操作的工作示例,它演示了如何在 sql 中綁定參數,它基於最新的 Spring Data R2dbc/Postgres。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM