【问题标题】:Get input query from batch parameters从批处理参数中获取输入查询
【发布时间】:2016-11-02 12:41:14
【问题描述】:

我需要从批处理参数中动态检索一个参数并将其设置为我的查询。这是我的实现:

<bean id="Reader" scope="step"
    class="org.springframework.batch.item.database.JpaPagingItemReader">
    <property name="entityManagerFactory"
        ref="entityManagerFactory" />

    <property name="queryString"
        value="SELECT distinct d FROM ReglementClient r 
                   JOIN FETCH d.etablissement e 
                   WHERE e.code = #{jobParameters[code]}
                   And r.statut in('Validé')
                " />

</bean>

我使用以下参数运行批处理:-Dcode=882。

我有以下错误:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: And near line 1, column 697 [SELECT distinct d FROM com.natixis.smartcontestation.emetteur.entite.ReglementClient r JOIN FETCH d.etablissement e And r.statut in('Validé') And e.code =  ]
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
    at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
    at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:281)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:93)

【问题讨论】:

  • 实际上它似乎工作,但 HQL 是错误的,您的 queryString 的 SQL 与堆栈跟踪中的不同,特别是 "JOIN FETCH d.etablissement e 和 r.statut in('Validé' ) 而 e.code = " 似乎是问题所在,afaik 你不能在 JOIN FETCH 之后直接使用 AND,它应该是 WHERE 或 WITH
  • 我的查询是:SELECT distinct d FROM ReglementClient r JOIN FETCH d.etablissement e WHERE r.statut in('Validé') And e.code = #{jobParameters[code]}。我认为问题是由于它无法检索#{jobParameters[code]}。我使用 -Dcode=882 使用参数“code”运行批处理
  • 那是无效的 JPQL(它不是 SQL!)。请查看一个体面的 JPQL 参考资料……关于“IN”关键字和 WHERE 子句。 JPQL 中没有“#”符号!
  • 那么我如何动态检索 e.code,正如我解释的那样,我的批处理输入中提供了 thios 值
  • 没有人能告诉你怎么做,因为你没有发布你的 ENTITY 类,所以他们不知道 e.code 或 r.statut 是什么。也许这个 "#{jobParameters[code]}" 将是一个简单的 ":myParam" ...但可能不是,因为它没有定义

标签: spring jpa spring-batch


【解决方案1】:

需要在jpql中指定普通参数语法,使用阅读器上的parameterValues属性来设置jobParameter

<bean id="Reader" scope="step"
      class="org.springframework.batch.item.database.JpaPagingItemReader">
    <property name="entityManagerFactory"
              ref="entityManagerFactory" />

    <property name="queryString"
              value="SELECT distinct d FROM ReglementClient r 
               JOIN FETCH d.etablissement e 
               WHERE e.code = :code
               And r.statut in('Validé')
            " />

    <property name="parameterValues">
        <map>
            <entry key="code" value="#{jobParameters[code]}"/>
        </map>
    </property>

</bean>

【讨论】:

  • stackoverflow.com/a/34900569/62201,它应该与SQL中的jobParameter一起工作
  • 嗯,好吧,那么可能是 xml 解码的问题,而不是使用 CDATA
  • 感谢您的回答。不幸的是,我遇到了这个错误: bean 的初始化失败;嵌套异常是 org.springframework.beans.factory.BeanExpressionException:表达式解析失败;嵌套异常是 org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'jobParameters' cannot be found on type of 'org.springframework.beans.factory.config.BeanExpressionContext'
  • 您是否在步骤范围之前/之外访问编写器?
【解决方案2】:

如果你使用标准的spring批处理机制来run jobs from the commandline,你需要为jobparameters遵循正确的模式

这些参数必须先传入路径和名称 第二。这些之后的所有参数都被认为是 JobParameters 并且必须是'name=value'的格式:

bash$ java CommandLineJobRunner endOfDayJob.xml endOfDay schedule.date(date)=2007/05/05

【讨论】:

    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 2010-12-03
    • 2017-03-16
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多