当前位置: 首页 > 面试题库 >

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

楚茂实
2023-03-14
问题内容

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

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

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

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

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

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

问候,


问题答案:

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

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

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

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


 类似资料:
  • 我有一个要求,我需要将搜索关键字应用于父实体(客户)的名称和状态,以及子实体 Order 的名称属性。 并在查询中包含子表,我正在执行以下操作 Hibernate正在生成下面的查询,但是我需要的是将order.name之类的比较添加到父块中。 我想要的是(lcase(order_.NAME)像?)在父块内。所以我想要的是以下内容 (this_名称)像? 或大小写(this_.状态) 像 ? 或大小

  • 问题内容: 我有如下表 如何通过下面的AND组合成一个IN语句来使用Restriction.in查询? 问题答案: 我认为这是您要使用的条件组合(顺便说一句,帮助Hibernate实体bean定义而不是表结构更容易):

  • 问题内容: 可以在SQL IN子句中放置1000多个项目吗?我们一直在遇到无法处理Oracle数据库的问题。 如果是的话,我们如何在SQL IN子句中放置1000多个项目? 如果没有,我还能做什么? 问题答案: 您应该将IN子句转换为INNER JOIN子句。 您可以像这样转换查询 在另一个查询中 您还将获得很多性能

  • 问题内容: 我正在从Java Collection Framework寻找一个不允许使用null元素的类。 你认识一个吗 问题答案: 大多数实现(值得注意的例外)不接受。 是一种不允许值的专用实现。

  • 我有一个叫做com的方法。ACM软件。共享。AbstractDerrivedBean。getDerivedUniqueId()。当我JProfiler应用程序时,这个方法getDerivedUniqueId()实际上像预期的那样埋在了80个方法的深处。该方法代表应用程序中的每个bean调用。我试图记录CPU调用树,从这个方法开始,一直记录到叶节点(即,被排除的类之一)。 我尝试了以下方法,但没有达

  • 问题内容: 我正在编写查询以获取与多个词组之一匹配的结果,例如 它可以按预期工作,但我有一个问题:10个得分结果都匹配相同的短语。 我想到的解决方案是将每个子句的结果数限制为例如5个元素。 问题在于,我看不到如何使用Elastic Search查询来实现此目的,也不知道是否可能,或者是否存在另一种执行我想要的方式。 有任何想法吗 ? 谢谢 ! 问题答案: 当您尝试实现3个查询的并集时,Elasti