5

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

4

3 回答 3

0

如果您list来自另一个 SQL 查询,请尝试WHERRE EXISTS改用。

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

IN数据库通常不能很好地处理数千个项目的子句。

于 2013-05-10T09:12:00.807 回答
0

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

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

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

于 2013-05-10T17:38:01.153 回答
0

文档似乎涵盖了此问题。作者建议分批进行这种操作。

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

于 2013-05-10T17:31:48.657 回答