2013-05-10 85 views
4

我有一個整數數組列表中有8000個項目。setParameterList與巨大的數據列表

而我使用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

哪個版本的Hibernate做到了這一點? 版本3.2中存在一個錯誤,可能與此問題有關:https://hibernate.atlassian.net/browse/HHH-2166 – hendrik 2015-07-02 15:56:38

回答

0

如果您的list來自另一個SQL查詢,請嘗試使用WHERRE EXISTS來代替。

否則,您可能必須在循環內獨立更新每個元素。

IN關於數千個項目的條款通常不能很好地被數據庫處理。

0

此問題似乎已由文檔涵蓋。作者建議分批做這種手術。

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

+0

hi @carbontax感謝您的重播。這可能對我將來有所幫助。 – user2130460 2013-05-13 06:51:11

+0

這裏的答案是否解決了你的問題? – carbontax 2013-05-13 11:02:29

+0

我發現一個解決方案是一次將200-300個項目拆分爲8000個In語句。而且我現在正在使用本機SQL。無論如何真的感謝你的回放。 – user2130460 2013-05-14 04:22:09

0

您的查詢不是有效的HQL查詢。您錯過了查詢中的設置子句:

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

也就是說,in子句中的8000個ID很多。數據庫對查詢的大小有限制。例如,Oracle在IN子句中不接受超過1000個元素。

+0

嗨@JB Nizet感謝您的重播。我知道查詢不合適。查詢只是爲了理解......並感謝關於IN子句中限制的提示。 – user2130460 2013-05-13 06:54:06

+0

解析HQL查詢時,Hibernate引發了異常。如果你想知道它爲什麼會發生,但是不提供你正在執行的實際查詢,我們怎麼能找到這個問題呢? – 2013-05-13 07:24:24

+0

好的。我認爲查詢在這種情況下並不重要,因爲我認爲IN語句的深度是這裏的問題。我發現一個解決方案是一次將200-300個項目拆分爲8000個報表。而且我現在正在使用本機SQL。無論如何真的感謝你的回放。 – user2130460 2013-05-14 04:21:48