java - 重构闭包标准以修复列表中表达式的最大数量为 1000

标签 java grails groovy closures criteria

我在我必须维护的应用程序中发现了以下代码

 def addCriteriaClosure = { criteriaList ->
   criteriaList.inList('id', paketInstance.dateien.id)
 }
 def criteria = Datei.createCriteria()
 def result = criteria.list() {
   addCriteriaClosure.call(criteria)
 }

遗憾的是,此调用会导致以下错误:

java.sql.SQLSyntaxErrorException: ORA-01795: maximum number of expressions in a list is 1000

事实上,paketInstance.dateien 包含超过 1000 行/项目。 为了避免此错误,我尝试了以下方法:

def addCriteriaClosure = { criteriaList ->
  paketInstance.dateien.asList().collate(999).each {
    criteriaList.inList('id', paketInstance.dateien.asList().collate(999).id)
  }
}

但这会导致此错误:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long

我知道解决方案是使用 collat​​e(999) 操作,但我不知道如何将其与初始方法结合起来以获得预期结果。

编辑#1

不幸的是我无法编辑这部分实现:

 def criteria = [Type].createCriteria()
 def result = criteria.list() {
   addCriteriaClosure.call(criteria)
 }

将具体类型传递给方法的位置。 我只能编辑 addCriteriaClosure 的定义 例如:

 def addCriteriaClosure = { criteriaList ->
   criteriaList.inList('id', paketInstance.dateien.id)
 }

编辑#2

当我设计如下的标准闭包时

def l = paketInstance.dateien.id.toList().collate(999)
        def addCriteriaClosure = { criteriaList ->

            l.each {
                a -> criteriaList.inList("id", a.toList())
            }
        }

Hibernate 创建一个 SQL 语句,将列表拆分为单独的 in WHERE 子句。但问题是这两个子句是用 AND 链接的。为了获得正确的结果,我需要两个列表的 OR,而不是生成的 sql 中的 AND

生成的 SQL:

 select this_.id as id51_0_, this_.version as version51_0_, this_.aktualisiert_am as aktualis3_51_0_, this_.name as name51_0_, this_.nummer as nummer51_0_, this_.pfad as pfad51_0_, this_.status as status51_0_, this_.typ as typ51_0_ from datei this_ where this_.id in (?, ?, ?, ?, ?, ?....)  and this_.id in (?, ?, ?, ?, ?, ?, ?....)

因此,我需要 或 this_.id ,而不是 和 this_.id

最佳答案

尝试这样的方法:

def manyThingsToFind = [...list of more than 1000 things...]
def clauseLimit = 999
def results = YourDomainObject.createCriteria().listDistinct {
  or {
    manyThingsToFind.collate(clauseLimit)?.each { collatedList ->
      'in'("fieldToMatch", collatedList)
    }
  }
}

如果您愿意,您可以将实际标准分解为一个闭包,就像您已经所做的那样。

关于java - 重构闭包标准以修复列表中表达式的最大数量为 1000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50155167/

相关文章:

java - 为什么我无法对内存数据库进行回滚?

gwt - 加载 grails gwt 模块 xml 时出错

grails - 如何在Grails项目的Spring Batch作业中配置监听器?

grails - 将服务注入(inject)多个域类以在 View 中使用

eclipse - 在 MAC 中找到 ggts.ini

groovy - 项目 (':projectName' ) {} 和 $projectRoot/projectName/build.gradle 之间有什么区别

android - 如何使用任务gradle删除文件

java - 安卓 : Picasso is not loading some images

java - 如何在同一行上获得多个输入而没有空格

java - 更改 IDEA 代码完成窗口中的字体颜色