在 R2DBCRepository SpringWebFlux 中使用@Query插入查询不起作用



似乎复合键/@Embedded在 R2DBC 中不受支持 - 链接,我正在尝试使用如下所示@Query注释插入数据。

@Repository("testRepository")
public interface TestRepository extends R2dbcRepository<Test, testEmbeddedId> {

@Modifying
@Query(value = "insert into test(id, name, status, created_date) VALUES ('b128f97d-d52c-4677-8746-00e2959c9ec6', 'c', 'd', '2022-10-28')")
@Transactional
void insertData();
}

但这失败了,没有给出任何错误。关于这个问题的任何想法或任何替代方法。

我认为您的方法insertData的签名应该返回一个Mono<Test>,您应该订阅该以执行插入语句,即将方法insertData声明为

@Modifying
@Query(value = "insert into test(id, name, status, created_date) VALUES ('b128f97d-d52c-4677-8746-00e2959c9ec6', 'c', 'd', '2022-10-28')")
@Transactional
Mono<Test> insertData();

然后执行它

insertData().subscribe();

这对我来说是一个简单的主键。

建议 - 将@Transactional向上移动到调用插入的服务方法。 被动,在您订阅之前不会发生任何事情。(根据多米尼克)。 在 application.properties(.yaml) 中设置这两个属性,将级别更改为 DEBUG,然后您至少会在执行 SQL 时看到它。

org.springframework.r2dbc.connection: INFO
org.springframework.r2dbc: INFO

我也更喜欢传递值以用作变量,如下所示:

@Query(FLAG_OLDER_DOCUMENTS)
Mono<Void> flagOlderDocumentsAsReplaced(Long customerId, String documentType, String documentSubType);
String FLAG_OLDER_DOCUMENTS = """
UPDATE customer_documents cd
SET cd.document_status = 'REPLACED'
WHERE cd.customer_id = :customerId
AND cd.document_type = :documentType
AND (:documentSubType is null or cd.document_sub_type = :documentSubType)
""";

最新更新