Java 对于Update语句,JDBC占位符限制的解决方法失败
我正在实现一个模式来绕过JDBC的限制。对于准备好的语句,JDBC将占位符的数量限制为2100。为了解决这个问题,我使用了一个包含2100+个值的xml字符串,并在SQL Server端使用函数tf_splitxml对其进行解析。我这样做是为了使用准备好的语句的~4个Java方法 这个tf_splitxml只构造一个包含所有值的列“token”。因此,xml字符串为:Java 对于Update语句,JDBC占位符限制的解决方法失败,java,sql-server,jdbc,prepared-statement,Java,Sql Server,Jdbc,Prepared Statement,我正在实现一个模式来绕过JDBC的限制。对于准备好的语句,JDBC将占位符的数量限制为2100。为了解决这个问题,我使用了一个包含2100+个值的xml字符串,并在SQL Server端使用函数tf_splitxml对其进行解析。我这样做是为了使用准备好的语句的~4个Java方法 这个tf_splitxml只构造一个包含所有值的列“token”。因此,xml字符串为: '<node><value>1</value><value>2</valu
'<node><value>1</value><value>2</value></node>'
它告诉我,将nvarchar值转换为int数据类型时,转换失败[对于上面的xml字符串]。奇怪的是,如果我提取由prepared语句设置的查询,我就可以在SQL Server中完美地运行它
我的想法:
我最诚挚的谢意(提前!) 那代码看起来很疯狂,看看我的。下面是一个简单的例子:
public void delete(final List<Integer> employeeIds) {
new ChunkWorkTemplate<Integer>(50, employeeIds) {
protected void executeOnChunk(List<Integer> chunk) {
Session session = getSession();
Query query = session.createSQLQuery("delete from Employee where employeeId in (:employeeIds)");
query.setParameterList("employeeIds", chunk);
query.executeUpdate();
}
}.execute();
}
public void delete(最终列表employeeid){
新的ChunkWorkTemplate(50个,员工ID){
受保护的void executeOnChunk(列表块){
Session=getSession();
Query Query=session.createSQLQuery(“从employeeId位于(:employeeId)中的员工中删除”);
setParameterList(“EmployeeId”,chunk);
query.executeUpdate();
}
}.execute();
}
请注意,模板的第一个参数是块大小,您可以随意设置。基本上,它会将输入集合分块,并分块执行主体。因此,在上面的示例中,如果您有207个员工ID,区块大小为50,那么您将有5个区块(50+50+50+50+7)。我写这篇文章就是为了解决你面临的问题。希望这有帮助。代码看起来很疯狂,请查看我的。下面是一个简单的例子:
public void delete(final List<Integer> employeeIds) {
new ChunkWorkTemplate<Integer>(50, employeeIds) {
protected void executeOnChunk(List<Integer> chunk) {
Session session = getSession();
Query query = session.createSQLQuery("delete from Employee where employeeId in (:employeeIds)");
query.setParameterList("employeeIds", chunk);
query.executeUpdate();
}
}.execute();
}
public void delete(最终列表employeeid){
新的ChunkWorkTemplate(50个,员工ID){
受保护的void executeOnChunk(列表块){
Session=getSession();
Query Query=session.createSQLQuery(“从employeeId位于(:employeeId)中的员工中删除”);
setParameterList(“EmployeeId”,chunk);
query.executeUpdate();
}
}.execute();
}
请注意,模板的第一个参数是块大小,您可以随意设置。基本上,它会将输入集合分块,并分块执行主体。因此,在上面的示例中,如果您有207个员工ID,区块大小为50,那么您将有5个区块(50+50+50+50+7)。我写这篇文章就是为了解决你面临的问题。希望这能有所帮助。jdbc对占位符的数量没有限制;这是您的特定驱动程序或数据库。对不起,我指的是SQLServer。你说得对,马克jdbc对占位符的数量没有限制;这是您的特定驱动程序或数据库。对不起,我指的是SQLServer。你说得对,马克嗨,乔纳森!谢谢你的意见。是的,这适用于我可以使用chunkify的情况。然而,如果我说:select*from tableA INTERNAL join tableBHi JONANSON!谢谢你的意见。这只适用于我可以进行chunkify的情况。如果我在多个联接表上执行select语句,您可能会遇到多个问题:1。批处理,也会执行重复处理。2.返回了错误的数据。(对于NOT IN子句,组块化并不容易。)嗨,乔纳森!谢谢你的意见。是的,这适用于我可以使用chunkify的情况。然而,如果我说:select*from tableA INTERNAL join tableBHi JONANSON!谢谢你的意见。这只适用于我可以进行chunkify的情况。如果我在多个联接表上执行select语句,您可能会遇到多个问题:1。批处理,也会执行重复处理。2.返回了错误的数据。(对于NOT IN子句,组块化并不容易。)