一尘不染

Hibernate + Oracle IN子句限制,如何解决?

hibernate

我知道这个问题已经发布了很多次,但是我想询问详细信息,

使用Oracle,您不能向IN子句传递1000个以上的参数,因此,将hibernate与oracle结合使用可以解决此问题,例如:

1-对于每个1000个参数列表,在IN子句之间使用OR子句,但这不适用,因为oracle的另一个限制是整个查询参数不超过2000

2-使用for循环,每次以1000个参数列表的形式运行查询,然后附加所有结果,如果您需要排序,或者使用具有不同级别修改的条件api,这不是很好

3-将参数列表放在临时物理表中,并加入它,甚至在子条件中使用它,这种解决方案我无法尝试,因为我不知道如何使用hibernate方式创建临时表,并且然后用它

因此,如果使用CRITERIA api有其他想法,请分享,或者即使有一种简单的方法来处理解决方案编号“ 3”

问候,


阅读 352

收藏
2020-06-20

共1个答案

一尘不染

首先,您需要向查询传递2000个以上的id(以您的第一个观点来判断),这本身就是一个警告。也许有更好的方法来解决潜在的问题。

您可以使用方法2并对每个列表进行排序,然后在应用程序中执行mergesort。这将需要额外的代码,但可能(假设实际查询速度相对较快)比方法3更好。

对于#3,处理临时表有2大缺点:

  • 虽然Hibernate确实支持它们(看一下Table.sqlTemporaryTableCreateString方法,它在Dialect类中使用了一堆支持方法),但它们在内部使用,并且需要您额外的编码才能从应用程序访问。
  • 更重要的是,使用临时表将迫使您将查询写为本机SQL(因为它不会被映射)。如果您使用的是Criteria API,则必须sqlRestriction与子查询一起使用 。
2020-06-20