2016-02-25 38 views
0

美好的一天,春天批处理preparedstatemnt子句

在春天的批量阅读器中,通常我会在阅读器中放入一个sql。 例如。

<bean id="zReader" class="ibs.batch.job.reader.ZTableReader" scope="step"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sql" 
     value="SELECT ZP.EMPLOYEEOLDIC, ZP.EMPLOYEENEWIC, ZP.EMPLOYEENAME, ZP.AMOUNT, ZP.ZAKATCODE 
         FROM S.ZPAYMENT ZP 
         WHERE ZP.DEDUCTIONMONTH = ? AND ZP.COMPANYREGNO = ? 
         AND ZP.MODIFIEDBY IS NULL " /> 
    <property name="preparedStatementSetter" ref="zReader" /> 
    <property name="rowMapper"> 
     <bean class="ibs.batch.job.reader.mapper.ZPaymentReaderTableMapper" /> 
    </property> 
    <property name="saveState" value="false" /> 
</bean> 

,然后,在我们的读者的java文件,我们将设置像

@Override 
public void setValues(PreparedStatement ps) throws SQLException { 
    ps.setString(1, employerName); 
    ps.setString(2, monthOfContribution); 
} 

现在我想查询更改为

SELECT ZP.EMPLOYEEOLDIC, ZP.EMPLOYEENEWIC, ZP.EMPLOYEENAME, ZP.AMOUNT, ZP.ZAKATCODE 
         FROM S.ZPAYMENT ZP 
         WHERE ZP.UserId in (?) 

,并在读者的Java文件中的参数,

String userIds = "'1871','1872'"; 
ps.setString(1, userIds); 

但是我w生病不断撞击SqlException,该SqlState = 22018

这是可能在春季批次?

+0

我怀疑这可能是与线ps.setString问题(1, “ '1871年', '1872年'”);这可能是由于报价不匹配。尝试硬编码SQL n中的值以确认n然后使用引号进行正确排列。 – Avis

+0

试过了,当我运行Sql时它的工作正常。 –

回答

0

我发现还有另一个更好的做到这一点。

哪个不是写xml文件中的sql查询,而是写在beforeStep()方法中的ZTableReader java文件中。在这里,我可以构建一个StringStringBuilder来灵活地构建我的sql查询。然后用户setSql()设置Sql查询。

示例代码:

String sql = "Select * from tableA where ....."; 

setSql(sql); 

然后把虚值对SQL在xml文件,例如:

<property name="sql" value="dummy" /> 

时候来ZTableReaderbeforeStep(), “虚拟” 值将被我定义的sql覆盖。

1

你不能代表几个值的占位符。占位符不仅仅是您稍后设置的参数值被复制粘贴的位置。换句话说,它如果通过'1871','1872'更换?作品其实是无关紧要的,因为这不是JDBC驱动程序是什么。

你真正需要每个个体的值,这意味着如果你想发送不同数量的值,你不能使用一个静态SQL字符串一个占位符。你必须想出另一个策略(比如说,在所需的值之前插入一个单独的临时表,然后在插入语句中从该临时表中选择,将其中一个类包装到另一个类中,以便在委托给它之前修复SQL语句等)

+0

正确,这应该解决问题。 – Avis

0

这与查询的问题,如果你已经知道的是要提供与在参数的数量,然后用它像

WHERE ZP.UserId in (?,?) 

and p.setString(1,'1871') p.setString(2,'1871') 

否则,构造一个SQL查询通过在in中附加字符串并激发查询,据我所知,在查询和准备语句中没有像样的解决方案。