【问题标题】:How to get the value from sum() in a Grails criteria如何从 Grails 标准中的 sum() 获取值
【发布时间】:2015-10-06 00:04:53
【问题描述】:

我不能将+ 运算符与resultado[0] + obj.nopersonas 一起使用,nopersonas 是一个整数。

fhinicio(blank:false, validator : { val, obj ->
    def diff = groovy.time.TimeCategory.minus(obj.fhfinal, val)
    def total = diff.hours*60 + diff.minutes
    if (total < 15){
        return "reserva.fhfinal.tiempo.min.label"
    } else {            
        if (total > 60) {
            return "reserva.fhfinal.tiempo.max.label"
        } else {
            def reserva = Reserva.createCriteria()
            def resultado = reserva.list() {
                or {
                    and {
                        ge('fhinicio', val)
                        le('fhinicio', obj.fhfinal)
                    }
                    and {
                        ge('fhfinal', val)
                        le('fhfinal', obj.fhfinal)
                    }
                }

                projections {
                    sum('nopersonas')
                }
            } 

            //this is not working   
            def aff = resultado[0] + obj.nopersonas

无法执行 null+null。 Stacktrace 如下:消息:无法执行 null+null

【问题讨论】:

  • 看来resultado[0]obj.nopersonas 都是null。如果是这种情况,请通过调试或简单地打印值来检查。

标签: grails grails-orm grails-2.3


【解决方案1】:

你有几个问题需要解决:

  1. 条件查询返回 null
  2. obj.nopersonas 为空

条件查询

要修复条件查询,请先不要投影:

def reserva = Reserva.createCriteria()
def resultado = reserva.list {
    or {
        and {
            ge('fhinicio', val)
            le('fhinicio', obj.fhfinal)
        }
        and {
            ge('fhfinal', val)
            le('fhfinal', obj.fhfinal)
        }
    }
}

确保您获得了适当的 Reserva 实例。然后,添加投影,由于您期望单个值,因此请使用 get() 方法而不是 list()。

def reserva = Reserva.createCriteria()
def resultado = reserva.get {
    or {
        and {
            ge('fhinicio', val)
            le('fhinicio', obj.fhfinal)
        }
        and {
            ge('fhfinal', val)
            le('fhfinal', obj.fhfinal)
        }
    }

    projections {
        sum('nopersonas')
    }
} 

def aff = resultado + obj.nopersonas

obj.nopersonas

由于obj.nopersonas 为空,我假设该属性可以为空。如果该属性应该可以为空,那么您需要在验证器中考虑这一点。

【讨论】:

    【解决方案2】:

    它正在工作。

    整数变量名 = Integer.valueOf(resultado[0].toString())

    【讨论】:

      【解决方案3】:

      你可以简单地处理空条件:

      def aff = (resultado[0] ?: 0) + (obj.nopersonas ?: 0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-20
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多