Java 具有大量数据的setParameterList列表
我有一个包含8000项的整数数组列表 我使用Java 具有大量数据的setParameterList列表,java,hql,Java,Hql,我有一个包含8000项的整数数组列表 我使用setParameterList方法在hql中设置数组列表 只是一个示例查询 return (Integer) sessionFactory.getCurrentSession().createQuery("update data where Id in (:list)").setParameterList("list", arrayList).executeUpdate(); 但是在执行查询之后,我得到了这个错误 java.lang.StackOv
setParameterList
方法在hql中设置数组列表
只是一个示例查询
return (Integer) sessionFactory.getCurrentSession().createQuery("update data where Id in (:list)").setParameterList("list", arrayList).executeUpdate();
但是在执行查询之后,我得到了这个错误
java.lang.StackOverflowError
at org.hibernate.hql.ast.QueryTranslatorImpl$JavaConstantConverter.visit(QueryTranslatorImpl.java:585)
at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:64)
at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:65)
at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:66)
at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:66)
at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:66)
at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:66)
at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:66)
at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:66)
在hibernate中有没有办法解决这个问题。这可能适用于纯sql查询。但我只想知道HQL中还有其他方法。如果您的
列表来自另一个SQL查询,请尝试使用where EXISTS
否则,您可能必须独立地更新循环中的每个元素
数据库通常不能很好地处理
中关于数千项的子句。文档似乎涵盖了这个问题。作者建议分批进行此类操作
您的查询不是有效的HQL查询。查询中缺少set子句:
update Data set foo = 7 where id in (:list)
这就是说,in子句中的8000个ID太多了。数据库对查询的大小有限制。例如,Oracle不接受in子句中超过1000个元素 你好,谢谢你的重播。这可能对我将来有所帮助。我找到了一个解决方案,将8000条语句一次拆分为200-300条。而且我现在正在使用本机sql。无论如何,非常感谢你的重播。嗨@JB,谢谢你的重播。我知道这种质疑是不恰当的。询问只是为了理解。。感谢您提供有关in子句中限制的提示。在解析HQL查询时,Hibernate引发了一个异常。如果您想知道它发生的原因,但不提供您试图执行的实际查询,我们如何找到问题?好的。我认为在这种情况下,查询没有那么重要,因为我认为in语句的深度是这里的问题。我找到了一个解决方案,将8000条语句一次拆分为200-300条。而且我现在正在使用本机sql。无论如何,非常感谢你的u回放。这是在哪个版本的Hibernate上发生的?版本3.2中有一个bug,可能与此问题有关: