7

Oracle 知道where a in (..)子句中 1000 个元素的限制。将 Hibernate 与 Oracle 结合使用时是否也存在此限制?

4

4 回答 4

4

这个数据库限制在休眠中仍然存在。如果您确实需要在 in 子句中包含 1000 多个项目,则您必须自己在代码中拆分列表并为每个 1000 个键块运行查询,然后将结果集附加在一起。

请注意,如果您的查询需要对查询结果进行排序或以其他方式聚合,则此 hack 将失效,因为只有在代码中才能知道完整的结果集。在这种情况下,您最好找到另一种编写不需要IN子句的查询的方法。

于 2009-11-04T16:00:31.787 回答
3

我们遇到了同样的问题,并通过将其拆分为 IN 子句的 100er 包来解决它

select * from mytable where id in (...) or id in (...).

评论:

  • 确保使用绑定变量
  • 确保查询看起来总是一样的。这是通过用 -1 填充 IN 子句来完成的,直到其中有 100 个元素
  • 尝试始终使用相同数量的 ORed in(...) 以便查询始终看起来相同

为什么要以上几点?这样查询优化器就可以重用查询计划。

附加优化:

  • 而不是使用-1,您可以再次使用最后一个真值。这甚至更好一点。

示例:in(1, 2, 3, 4, 4, ..., 4)

另请注意:我们在 in 子句中使用各种固定数量的元素进行了测试,并观察到超过 100 个元素的性能下降。

于 2012-01-04T20:30:41.390 回答
2

是的,因为 Hibernate 会在某个阶段调用 Oracle,因此限制是 Hibernate 和 Oracle 限制中的最低值

Hibernate 对 in 的数据没有什么特别的 - 只是将它传递给数据库

于 2009-11-04T12:38:14.370 回答
1

这似乎是Hibernate中的一个Bug:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-1123

于 2010-01-27T05:27:21.780 回答