我有一堆JPA实体,我像这样检索它们:
.handle(Jpa.retrievingGateway(myEntityManagerFactory).namedQuery(readQuery))
.transform(/* remove some of the entities from the message, leaving only the ones I want to delete */)
现在我想删除其中的一些。做这件事最好的方法是什么?我在想,一定有一些简单的方法可以用一个非常简单的或者甚至根本不显式的jpaQuery()来完成这个任务?
我的想象是这样的:
.handle(Jpa.updatingGateway(myEntityManagerFactory)
.jpaQuery("delete from MyTable m where m in :items")
.parameter("items", ...(?)... )
或者像这样:
.handle(Jpa.deletingGateway(myEntityManagerFactory))
使用Spring Integration DSL实现这一点的正确方法是什么?
发布于 2021-08-11 07:26:18
你可以这样做:
.handle(Jpa.updatingGateway(entityManagerFactory).persistMode(PersistMode.DELETE))
尽管它只适用于单个实体。因此,考虑让您的集成流程如下所示:
.handle(Jpa.retrievingGateway(myEntityManagerFactory).namedQuery(readQuery))
.transform(/* remove some of the entities from the message, leaving only the ones I want to delete */)
.split()
.handle(Jpa.updatingGateway(entityManagerFactory).persistMode(PersistMode.DELETE))
我的意思是在JPA网关之前添加一个拆分器。当然,如果您的.transform()
返回列表的话。
我认为,如果消息的有效负载是一个Iterable
,那么对于像您这样的用例,我们可能会更方便。已经有一个JpaOperations.deleteInBatch()
。因此,JpaExecutor.executeOutboundJpaOperationOnPersistentMode()
可以在其分支中进行改进:
case DELETE:
this.jpaOperations.delete(payload);
if (this.flush) {
this.jpaOperations.flush();
}
return payload;
请随时提出GH问题,我们将最终对其进行修改!
https://stackoverflow.com/questions/68744643
复制相似问题