【发布时间】: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