Spring 集成 DSL:如何删除 JPA 实体列表?

Spring Integration DSL: How do I delete a list of JPA entities?

我有一堆像这样检索的 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 集成 DSL 执行此操作的正确方法是什么?

你可以这样做:

.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() returns 列表.

我认为如果消息的有效负载是 Iterable,我们可能会让像您这样的用例更方便。已经有一个 JpaOperations.deleteInBatch()。因此,JpaExecutor.executeOutboundJpaOperationOnPersistentMode() 可以在其分支中得到改进:

case DELETE:
            this.jpaOperations.delete(payload);
            if (this.flush) {
                this.jpaOperations.flush();
            }
            return payload;

随时提出 GH 问题,我们最终会对其进行修改!