Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有大量数据的setParameterList列表_Java_Hql - Fatal编程技术网

Java 具有大量数据的setParameterList列表

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

我有一个包含8000项的整数数组列表

我使用
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,可能与此问题有关: