Hibernate + Oracle IN子句限制,如何解决呢?
我知道这个问题多次发布,但我想询问细节,
使用Oracle,你不能传递超过1000个参数的IN子句,所以使用hracle与oracle可能有一些解决这个问题的方法,如:
1-在每个1000参数列表的IN子句之间使用OR子句,但这不适用,因为oracle的其他限制因为整个查询参数不超过2000
2-使用for循环,每次运行1000个参数列表中的查询,然后追加所有结果,如果需要排序,或者使用不同级别修改的条件api,这不是很好
3-将参数列表放在临时物理表中,并加入它,甚至在子标准中使用它,这个解决方案我不能尝试,因为我不知道如何使用hibernate创建临时表,以及然后用它,
所以如果使用CRITERIA api有任何其他想法请分享,或者即使有一个简单的方法来处理解决方案号码’3′
问候,
首先,您需要将超过2000个ID(通过您的第一点判断)传递给查询这一事实本身就是一个警钟。 也许有更好的方法来解决潜在的问题。
您可以使用方法#2并对每个列表进行排序,然后在应用程序中执行mergesort。 这将需要额外的代码,但可能(假设实际查询相对较快)比方法#3表现更好。
对于#3,处理临时表有两大缺点:
- 虽然Hibernate确实支持它们(看看
Table.sqlTemporaryTableCreateString
方法,它在Dialect
类中使用了一堆支持方法),但它们在内部使用,需要额外的编码才能从应用程序访问。 - 更重要的是,使用临时表将强制您将查询编写为本机SQL(因为它不会被映射)。 如果您正在使用Criteria API,则必须将
sqlRestriction
与子查询一起使用。
在Guava Lists和Hibernate Disjunction的帮助下:
Disjunction disjunction = Restrictions.disjunction(); for (List> chunkList: Lists.partition(largeList, 1000)) { disjunction.add(Restrictions.in(propertyName, chunkList)); } criteria.add(disjunction);
- 缺少序列或表:hibernate_sequence
- 除非访问集合,否则Hibernate OneToMany FetchType.LAZY无法正常工作?
- 如何使用Hibernate检索类的成员对象?
- 如何使用返回参数从Hibernate调用Oracle函数?
- junit测试中的spring-data-jpa beanvalidation
- hibernate列名称问题
- HibernateException当从控制器调用服务但在我的测试中没有找到当前线程的会话
- 如何使用JPA解决javax.persistence.EntityNotFoundException(而不是使用@NotFound)
- Java Hibernate / C3P0错误:“无法获取连接元数据。 客户端尝试签出连接的尝试已经超时。“