【问题标题】:SQL Error: 1795, SQLState: 42000 - maximum number of expressions in a list is 1000SQL 错误:1795,SQLState:42000 - 列表中的最大表达式数为 1000
【发布时间】:2016-12-21 13:42:39
【问题描述】:
SELECT ID FROM PERSON WHERE ID IN (:personIds) AND ( HAS_PAID IS NULL OR HAS_PAID = 'N') ;

在上面的查询中,我传递了一个 list 字符串,其中包含之前在我的 Java 应用程序中创建的字符串。

上述查询给出了我的应用程序中的某些数据集的以下问题,因为列表 ( personIds ) 包含 1000 多个 成员:

WARN  o.h.internal.AbstractQueryImpl - HHH000443: Dialect [org.hibernate.dialect.Oracle10gDialect] limits the number of elements in an IN predicate to 1000 entries.  
However, the given parameter list [personIds] contained 1041 entries, which will likely cause failures to execute the query in the database
WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1795, SQLState: 42000
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - ORA-01795: maximum number of expressions in a list is 1000

有什么方法可以更改我的查询,以便避免出现此错误?

【问题讨论】:

  • 没有重复,因为该问题中的 IN 子句是一个查询,而我在我的列表中传递了一个列表
  • Another possible duplicate。您如何生成列表 - 您使用什么数据类型和 setXXX() 方法来设置 :personIds?您也许可以将其转换为数组(请参阅我对该问题的回答)。
  • 我会完全按照亚历克斯·普尔在他在上面的评论中链接到的线程中所展示的那样做——我打算将其作为答案提出,但决定先访问该链接,就在那里。

标签: java string list oracle11g entitymanager


【解决方案1】:

您可以将列表拆分为更小的子列表,然后这样做

where foo in (:list1) or foo in (:list2) or ....

【讨论】:

  • 所以在我调用此查询之前,在应用程序的早期将列表拆分为更小的列表>
  • 好的,如果有的话,这将如何影响查询的性能?
  • 不知道你的表有多大,先弄“不工作”->“工作”再来性能调优。
  • 使用 Guava 库拆分列表的最佳方法是什么?
  • @java123999 你可以自己做。您不需要仅用于此操作的额外库。但是,如果您已经有一些提供此功能的库。你可以肯定地使用它。检查子列表()
猜你喜欢
  • 1970-01-01
  • 2018-11-15
  • 2015-05-29
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多