嗨,我正在尝试从Postgres数据库的一个表中删除用户的ID。我正在使用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;"
控制器中的方法:
@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
。
我还有其他方法以同样的方式执行insert
和select
语句,它们工作得很好。
我对它的测试:
@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()
进行自定义删除查询?
1条答案
按热度按时间cbwuti441#
希望您使用的是最新的R2 dbc 1.0和Spring Data R2 dbc(由Sping Boot 3.0管理)。
您的方法
deleteWithCustomSql
不起作用。databaseCLient.exectue
上没有订阅,sql永远不会执行并返回结果。尝试更改为以下内容,将sql移到此处,并使用
bind
将参数绑定到sql。在控制器中,更改为以下内容。
检查我的
delete
操作的工作示例,它演示了如何在sql中绑定参数,它基于最新的Spring Data R2 dbc/Postgres。