java - 重构闭包条件以修复列表中的最大表达式数为 1000
问题描述
我在必须维护的应用程序中找到了以下代码
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
我知道解决方案是使用collate(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
两个列表,而不是AND
生成的 sql
产生的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 (?, ?, ?, ?, ?, ?, ?....)
所以and this_.id
我需要而不是or this_.id in
解决方案
尝试这样的方法:
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)
}
}
}
如果您愿意,您可以将实际标准分解为闭包,就像您已经完成的那样。
推荐阅读
- c++ - 如何声明 2d std::array
- c# - 缓存网站时未检测到 CefSharp 响应
- java - 转义引用 - 如何合法地更新对象数据?
- visual-studio - 升级 .NET 框架:我是否也需要在测试和生产服务器上安装 .NET 框架?
- linux - 如何在 for 循环中对 curl 执行 grep?
- python - 在 select() 中等待匿名管道变得可读时如何检测孩子的退出?
- json - 在 Linux 上与 libaws-cpp-sdk-core.so 链接的未解析符号
- java - 使用 Gradle 为期望依赖添加 Maven 存储库
- datatables - 无法使用动态数据重新排序 DataTables 列
- ios - 为什么我不能设置 UIScreen.main.brightness?