【问题标题】:setParameterList list with huge data具有大量数据的 setParameterList 列表
【发布时间】:2013-05-04 22:11:02
【问题描述】:

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

【问题讨论】:

标签: java hql


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 嗨@carbontax 感谢您的重播。这可能对我将来有帮助。
    • 我找到了一种解决方案,它一次将 8000 In 语句拆分为 200 - 300 个项目。而且我现在正在使用本机sql。无论如何,真的感谢你重播。
    【解决方案3】:

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

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

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

    【讨论】:

    • 嗨@JB Nizet 感谢您的重播。我知道查询不正确。查询只是为了理解..并感谢有关 IN 子句限制的提示。
    • Hibernate在解析HQL查询时抛出异常。如果您想知道它发生的原因,但不提供您尝试执行的实际查询,我们如何才能找到问题?
    • 好的。我认为在这种情况下查询并不那么重要,因为我认为 IN 语句的深度是这里的问题。我找到了一种解决方案,它一次将 8000 In 语句拆分为 200 - 300 个项目。而且我现在正在使用本机sql。无论如何,真的感谢你重播。
    猜你喜欢
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2012-01-06
    • 2014-11-12
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多