Spring Integration整合JPA报错:查询含参数但未提供参数源
解决Spring Integration JpaExecutor轮询时的参数源缺失问题
你这是想用Spring Integration的JpaExecutor每5秒轮询数据库,捞取最近5秒更新或创建的Product记录,但碰到了参数源未提供的错误对吧?这个问题的核心很明确:你现在硬编码了固定的参数值,而且没配置动态参数的提供者——毕竟每次轮询都得用当前时间往前推5秒当参数,总不能一直用2019-02-28 12:02:15.000这个死值吧?
错误原因解析
报错Query has parameters but no parameter source provided,是因为Spring Integration的JpaExecutor发现你的JPQL里有:updateDttm参数,但没收到能动态生成参数值的来源。你之前用setJpaParameters设置的是固定参数,这种方式只适合参数值不会变的场景,完全满足不了你“每次轮询都用最新的过去5秒时间”的需求。
解决方案:配置动态参数源
你可以用ExpressionEvaluatingParameterSourceFactory,通过SpEL表达式动态计算参数值,这样每次轮询时都会自动生成最新的updateDttm参数。调整后的完整代码如下:
@Bean public JpaExecutor jpaExecutor() { JpaExecutor executor = new JpaExecutor(this.entityManagerFactory); executor.setJpaQuery("from Product p where p.updateDttm >= :updateDttm"); // 创建表达式驱动的参数源工厂 ExpressionEvaluatingParameterSourceFactory parameterSourceFactory = new ExpressionEvaluatingParameterSourceFactory(); Map<String, String> parameterExpressions = new HashMap<>(); // 根据实体类中updateDttm的类型选择对应SpEL表达式: // 若为java.time.LocalDateTime类型: parameterExpressions.put("updateDttm", "T(java.time.LocalDateTime).now().minusSeconds(5)"); // 若为java.util.Date类型,替换成下面的表达式: // parameterExpressions.put("updateDttm", "T(java.util.Date).from(T(java.time.Instant).now().minusSeconds(5))"); parameterSourceFactory.setParameterExpressions(parameterExpressions); executor.setParameterSourceFactory(parameterSourceFactory); return executor; }
代码说明
- 删掉了原来的
setJpaParameters调用,换成ParameterSourceFactory来提供动态参数。 - SpEL表达式
T(java.time.LocalDateTime).now().minusSeconds(5)会在每次轮询时执行,算出当前时间往前推5秒的时间,作为:updateDttm的参数值。 - 如果你的实体类中
updateDttm是java.util.Date类型,记得替换成注释里对应的表达式,避免类型不匹配。
这么配置后,JpaExecutor每次轮询都会自动获取最新的参数值,既满足了业务需求,也解决了参数源缺失的错误。
内容的提问来源于stack exchange,提问作者user11173719
相关产品推荐
相关产品推荐

