我知道这个问题已经发了很多次了,但我想问一下细节,
使用 Oracle,您不能向 IN 子句传递超过 1000 个参数,因此将 hibernate 与 Oracle 一起使用可能有一些解决此问题的方案,例如:
1- 对于每个 1000 个参数列表,在 IN 子句之间使用 OR 子句,但这不适用,因为 oracle 对整个查询参数不超过 2000 个的其他限制
2-使用for循环,每次根据1000个参数列表运行查询,然后附加所有结果,如果您需要排序,这不是很好,或者使用具有不同级别修改的criteria api
3-将参数列表放入临时物理表中,然后加入它,甚至在子条件中使用它,这个解决方案我无法尝试,因为我不知道如何使用休眠创建临时表,并且然后使用它,
因此,如果使用 CRITERIA api 有任何其他想法,请分享,或者即使有一个简单的方法来处理解决方案编号“3”
问候,
首先,您需要将超过 2000 个 id(根据第一点判断)传递给查询这一事实本身就是一个警告。也许有更好的方法来解决根本问题。
您可以使用方法 #2 对每个列表进行排序,然后在应用程序中执行合并排序。这将需要额外的代码,但可能(假设实际查询相对较快)比方法 #3 执行得更好。
对于#3,处理临时表有两个很大的缺点:
- 而 Hibernate 确实支持它们(看看
Table.sqlTemporaryTableCreateString
方法,它使用了一堆支持方法Dialect
类),它们在内部使用,并且需要您进行额外的编码才能从应用程序访问。
- 更重要的是,使用临时表将迫使您将查询编写为本机 SQL(因为它不会被映射)。如果您使用 Criteria API,则必须使用
sqlRestriction
与子查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)