Grails 在GORM criteriaBuilder中包含“最大”和“偏移”条件将返回错误

Grails 在GORM criteriaBuilder中包含“最大”和“偏移”条件将返回错误,grails,gorm,hibernate-criteria,Grails,Gorm,Hibernate Criteria,我可以把代码缩短吗 if(count == null && from = null) { creditAdviceList = CreditAdvice.findAll { ilike('id', "%$idFilter%") ..... ilike('statusCode', statusCodeFilter) } } else if(count != null && from == null) {

我可以把代码缩短吗

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
语句。想象一下,如果在参数中也要使用
order
cache
,那么基本上将有16个唯一的
if
语句

我尝试了以下[更多]简短的代码:

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

    if(count != null) {
        maxResults(count)
    }
    if(from != null) {
        firstResult(from)
    }
}
但这给了我一个错误:

…没有方法的签名:grails.gorm.DetachedCriteria.maxResults()适用于参数类型:(java.lang.Integer).


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

findAll
传递闭包后,在内部使用了
DetachedCriteria
,这与您从文档中提到的
createCriteria
中得到的结果不同。如果groovy能够找到足够接近的东西,它会在错误消息中告诉您。处理max/from需求的最简单方法是使用map(这是传递的第一个参数)。例如:


混合、匹配、提取、按您认为合适的方式缩短

据我所知,唯一的区别是分页选项。如果我的眼睛没有欺骗我,是的,你可以:

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

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

IDE不应该有复制和粘贴按钮;)第二个版本可以工作,您只需将“findAll{…}”替换为“createCriteria().list{…}”:
Map paginationArgs = [max: count, offset: from].findAll { 
   it.value != null 
}
List<CreditAdvice> creditAdviceList = CreditAdvice.findAll(paginationArgs) {
   ilike('id', "%$idFilter%")
   .....
   ilike('statusCode', statusCodeFilter)
}