setParameterList列表包含大量数据

时间:2013-05-10 09:02:58

标签: java hql

我有一个包含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还有其他任何方法。

3 个答案:

答案 0 :(得分:0)

如果您的list来自其他SQL查询,请尝试改为使用WHERRE EXISTS

否则,您可能必须在循环内独立更新每个元素。

关于数千个项目的

IN条款通常不能很好地处理数据库。

答案 1 :(得分:0)

此问题似乎包含在文档中。作者建议分批进行这种操作。

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html

答案 2 :(得分:0)

您的查询不是有效的HQL查询。您错过了查询中的set子句:

update Data set foo = 7 where id in (:list)

也就是说,in子句中的8000个ID很多。数据库对查询的大小有限制。例如,Oracle在IN子句中不接受超过1000个元素。