Как установить параметр Jpa Query из MessagingGateway?

Я реализую шаблон Transactional Outbox с использованием 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);
}

Мой объект домена:

@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;
}
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Было бы здорово увидеть ваш запрос и то, как вы хотели бы, чтобы этот Long idOfEntity был сопоставлен с некоторым параметром запроса.

Документ для этого setUsePayloadAsParameterSource выглядит так:

use-payload-as-parameter-source

If set to true, the payload of the Message is used as a source for parameters. If set to false, the entire Message is available as a source for parameters. If no JPA Parameters are passed in, this property defaults to true. This means that, if you use a default BeanPropertyParameterSourceFactory, the bean properties of the payload are used as a source for parameter values for the JPA query. However, if JPA Parameters are passed in, this property, by default, evaluates to false. The reason is that JPA Parameters let you provide SpEL Expressions. Therefore, it is highly beneficial to have access to the entire Message, including the headers. Optional.

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

Возможно, вы бы предпочли, чтобы эта опция использовалась как false, а затем в вашем запросе вы могли бы использовать параметр для этого idOfEntity как просто заполнитель :payload.

Благодарю вас! Я загрузил свой объект домена с запросом!

user688291 17.05.2022 08:10

Решение состояло в том, чтобы поместить «: payload» в качестве заполнителя в запросе и установить для UsePayloadAsParameterSource значение false!

user688291 17.05.2022 09:13

Другие вопросы по теме