繁体   English   中英

如何从 MessagingGateway 设置 Jpa 查询参数?

[英]How do I set the Jpa Query parameter from MessagingGateway?

我正在使用 Java 实现事务性发件箱模式。消息中继服务将轮询发件箱表中的条目,在找到并处理发件箱消息后,它将更新发件箱条目。

问题是,如何将参数从 MessagingGateway 设置为 Jpa 查询?

@Bean
public JpaExecutor jpaUpdateStateExecutor() {
    JpaExecutor jpaExecutor = new JpaExecutor(this.entityManagerFactory);
    jpaExecutor.setNamedQuery("myQuery");
    jpaExecutor.setUsePayloadAsParameterSource(true);
    jpaExecutor.setExpectSingleResult(true);
    return jpaExecutor;
}

@Bean
@ServiceActivator(inputChannel = "jpaChannel")
public MessageHandler jpaOutbound() {
    JpaOutboundGateway gateway = new JpaOutboundGateway(jpaUpdateStateExecutor());
    gateway.setGatewayType(OutboundGatewayType.UPDATING);
    return gateway;
}

我的网关:

@MessagingGateway
public interface MyGateway {
    @Gateway(requestChannel = "jpaChannel")
    @Transactional
    void jpaActions(Long idOfEntity);
}

我的域名 object:

@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table
@NamedQuery(name = "myQuery", query = "UPDATE MyTable SET state = 'PROCESSED' WHERE id = :id")
public class Outbox {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    private String state;
}

很高兴看到您的查询以及您希望如何将Long idOfEntity映射到某个查询参数。

setUsePayloadAsParameterSource的文档如下所示:

使用有效负载作为参数源

如果设置为 true,消息的有效负载将用作参数源。 如果设置为 false,则整个消息都可用作参数源。 如果没有传入 JPA 参数,则该属性默认为true。 这意味着,如果您使用默认的BeanPropertyParameterSourceFactory ,有效负载的 bean 属性将用作 JPA 查询的参数值的来源。 但是,如果传入 JPA 参数,则默认情况下,此属性的计算结果为 false。 原因是 JPA 参数让你提供 SpEL 表达式。 因此,访问整个消息(包括标题)是非常有益的。 选修的。

https://docs.spring.io/spring-integration/docs/current/reference/html/jpa.html#jpa-outbound-gateway-common-parameters

也许您更愿意将该选项设置为false ,然后在您的查询中您可以使用该idOfEntity的参数作为:payload占位符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM