You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

代码说明

  1. 删掉了原来的setJpaParameters调用,换成ParameterSourceFactory来提供动态参数。
  2. SpEL表达式T(java.time.LocalDateTime).now().minusSeconds(5)会在每次轮询时执行,算出当前时间往前推5秒的时间,作为:updateDttm的参数值。
  3. 如果你的实体类中updateDttm是java.util.Date类型,记得替换成注释里对应的表达式,避免类型不匹配。

这么配置后,JpaExecutor每次轮询都会自动获取最新的参数值,既满足了业务需求,也解决了参数源缺失的错误。

内容的提问来源于stack exchange,提问作者user11173719

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:24:42