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