在 GORM criteriaBuilder returns 中包含最大和偏移标准是一个错误

Including the max and offset criteria inside GORM criteriaBuilder returns an error

我可以缩短这段代码吗?

if(count == null && from = null) {
    creditAdviceList = CreditAdvice.findAll {
        ilike('id', "%$idFilter%")
        .....
        ilike('statusCode', statusCodeFilter)
    }
}
else if(count != null && from == null) {
    creditAdviceList = CreditAdvice.findAll(max: count) {
        ilike('id', "%$idFilter%")
        .....
        ilike('statusCode', statusCodeFilter)
    }
}
else if(count == null && from != null) {
    creditAdviceList = CreditAdvice.findAll(offset: from) {
        ilike('id', "%$idFilter%")
        .....
        ilike('statusCode', statusCodeFilter)
    }
}
else if(count != null && from != null) {
    creditAdviceList = CreditAdvice.findAll(max: count, offset: from) {
        ilike('id', "%$idFilter%")
        .....
        ilike('statusCode', statusCodeFilter)
    }
}

你看,它是针对每种可能情况的一系列 if 声明。想象一下,如果在参数中也使用 ordercache - 基本上会有 16 个独特的 if 语句!

我试过这个[更多]更短的代码:

creditAdviceList = CreditAdvice.findAll {
    ilike('id', "%$idFilter%")
    .....
    ilike('statusCode', statusCodeFilter)

    if(count != null) {
        maxResults(count)
    }
    if(from != null) {
        firstResult(from)
    }
}

但是它给我一个错误:

...No signature of method: grails.gorm.DetachedCriteria.maxResults() is applicable for argument types: (java.lang.Integer)...

我尝试将offset转换为intIntegerString等。我还省略了条件中的if语句,但是出现相同的错误消息。

通过闭包的

findAll 在内部使用 DetachedCriteria,这与您从文档中提到的 createCriteria 获得的结果不同。如果 groovy 会发现 "something close" 就足够了,它会在错误消息中告诉您。处理 max/from 需求的最简单方法是使用地图(这是传递的第一个参数)。例如:

def qcfg = [:]
if (count) {
    qcfg.count = count
}
if (from) {
    qcfg.offset = from
}
creditAdviceList = CreditAdvice.findAll(qcfg) { ... }

随意混合、匹配、提取、缩短

据我所知,唯一的区别是分页选项。如果我没看错的话,是的,你可以:

Map paginationArgs = [max: count, offset: from].findAll { 
   it.value != null 
}
List<CreditAdvice> creditAdviceList = CreditAdvice.findAll(paginationArgs) {
   ilike('id', "%$idFilter%")
   .....
   ilike('statusCode', statusCodeFilter)
}

您可以设置不同的样式,但基本上您可以先构建分页参数,然后将它们传递给 findAll。没有重复的代码,条件的责任更明确。为澄清起见,我添加了所有选项,然后过滤它们以排除为空的选项。