Oracle知道where a in (..)
子句中对1000个元素的限制。将Hibernate与Oracle结合使用时是否也存在此限制?
答案 0 :(得分:4)
这个数据库限制仍然存在于hibernate中。如果你的in子句中确实需要超过1000个项目,则必须在代码中自己拆分列表,并为每个1000个键块运行查询,然后将结果集附加在一起。
请注意,如果您的查询需要排序或以其他方式聚合查询结果,则此hack会崩溃,因为只有代码中才会知道完整的结果集。在这种情况下,您最好找到另一种方法来编写不需要IN
子句的查询。
答案 1 :(得分:3)
我们遇到了同样的问题,并通过将其拆分为100个IN子句包
来解决它select * from mytable where id in (...) or id in (...).
说明:
为什么你想要上述要点?这样查询优化器就可以重用查询计划。
其他优化:
示例:in(1,2,3,4,4,...,4)
另请注意:我们使用in子句中的各种固定数量的元素进行了测试,观察到的性能下降超过100个元素。
答案 2 :(得分:2)
是的,因为Hibernate会在某个阶段调用Oracle,所以限制是Hibernate和Oracle中限制的最低限度
Hibernate对于in的数据没什么特别的 - 只是将它传递给数据库
答案 3 :(得分:1)
这似乎是Hibernate中的一个Bug:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1123