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)
}