Actualmente estoy desarrollando una aplicación basada en el marco Spring Boot que emplea un adaptador de canal de entrada JPA para recuperar datos de una base de datos relacional. Tengo un procedimiento almacenado llamado GetEmployee que debe aceptar un valor que varía según la instancia del servidor en la que se ejecuta la aplicación.
Revisé la documentación de Spring sobre adaptadores y menciona una etiqueta llamada int-jpa:parameter, pero parece que solo se utiliza cuando se utiliza el atributo de consulta con nombre en lugar del atributo de consulta nativa.
También hay un atributo de fuente de parámetro en la etiqueta int-jpa:inbound-channel-adapter , pero no he encontrado ninguna buena documentación sobre cómo utilizarlo.
¿Hay alguna forma de pasar un parámetro de un bean Spring a la consulta nativa? ¿O es el mejor enfoque usar el atributo de consulta con nombre?
XML de configuración:
<int-jpa:inbound-channel-adapter id="employeeAdapter" channel="employeeChannel" entity-manager-factory="entityManagerFactory" entity-class="com.example.entities.Employee" native-query="EXEC emp.dbo.GetEmployee" expect-single-result="false" delete-after-poll="false"> <int:poller fixed-rate="10000"> <int:transactional propagation="REQUIRED" isolation="DEFAULT" transaction-manager="transactionManager" /> </int:poller> </int-jpa:inbound-channel-adapter>Bueno, eso realmente funciona solo si su consulta declara algunos parámetros:
/** * Given a JPQL query, this method gets all parameters defined in this query and * use the {@link ParameterSource} to find their values and set them. * */ private void setParametersIfRequired(String queryString, ParameterSource source, Query query) { Set<Parameter<?>> parameters = query.getParameters(); Dado que su EXEC no tiene ningún parámetro en la llamada al procedimiento, no hay nada que extraer y aplicar para los int-jpa:parameter s proporcionados.
Considere usar CALL emp.dbo.GetEmployee(?) o BEGIN emp.dbo.GetEmployee(?); END; . No estoy seguro de qué sintaxis funcionará para su RDBMS.
Por otro lado, echaría un vistazo a la compatibilidad con Spring Integration Stored Procedure .