似乎复合键/@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)
""";