2016-06-30 72 views
0

我需要從批處理參數中動態檢索參數並將其設置爲我的查詢。這是我的實現:從批處理參數獲取輸入查詢

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

我運行我的批處理usine以下參數:-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) 
+0

實際上它似乎工作,但HQL是錯誤的,你的查詢字符串SQL從一個在堆棧跟蹤的不同,特別是「連接抓取在d.etablissement E和r.statut(」 Validé')和e.code =「似乎是問題,afaik在JOIN FETCH之後不能直接使用AND,它應該是WHERE或WITH –

+0

我的查詢是:SELECT distinct d FROM ReglementClient r JOIN FETCH d.etablissement e WHERE r.statut in('Validé')and e.code =#{jobParameters [code]}。我認爲問題是由於它無法檢索#{jobParameters [code]}。我使用參數'code'運行批處理,使用-Dcode = 882 –

+0

這是無效的JPQL(它不是SQL!)。請查看一個體面的JPQL參考...關於「IN」關鍵字和WHERE子句。 JPQL中沒有「#」符號! –

回答

0

,如果你使用標準的Spring Batch的機制run jobs from the commandline,您需要按照正確的模式爲jobparameters

這些參數必須傳入首先是路徑,名稱爲 秒。之後,這些所有的參數都被認爲是JobParameters ,必須在「名=值」的格式:

bash$ java CommandLineJobRunner endOfDayJob.xml endOfDay schedule.date(date)=2007/05/05 
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> 
+0

請參閱http://stackoverflow.com/a/34900569/62201,它應該使用SQL –

+0

中的jobParameter嗯好了,可能是xml解碼的問題,然後,不使用CDATA – Andreas

+0

感謝您的回答。不幸的是我有這個錯誤:bean初始化失敗;嵌套異常是org.springframework.beans.factory.BeanExpressionException:表達式解析失敗;嵌套的異常是org.springframework.expression.spel.SpelEvaluationException:EL1008E :(pos 0):無法在類型爲'org.springframework.beans.factory.config.BeanExpressionContext'的對象上找到字段或屬性'jobParameters' –