在 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
声明。想象一下,如果在参数中也使用 order
和 cache
- 基本上会有 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
转换为int
、Integer
、String
等。我还省略了条件中的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
。没有重复的代码,条件的责任更明确。为澄清起见,我添加了所有选项,然后过滤它们以排除为空的选项。
我可以缩短这段代码吗?
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)
}
}
但是它给我一个错误:
...No signature of method: grails.gorm.DetachedCriteria.maxResults() is applicable for argument types: (java.lang.Integer)...
我尝试将offset
转换为int
、Integer
、String
等。我还省略了条件中的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
。没有重复的代码,条件的责任更明确。为澄清起见,我添加了所有选项,然后过滤它们以排除为空的选项。