Grails - 如果值为负,则将值显示为 0

Grails - if value is negative, show value as 0

这是asset.groovy

中的公式代码
static mapping = {
    yearNow formula: 'YEAR(purchase_date)'
    yearlyValue formula: 'PURCHASE_AMOUNT / LIFE_EXPECTANCY'
    value formula: 'PURCHASE_AMOUNT / LIFE_EXPECTANCY * (LIFE_EXPECTANCY - (YEAR(NOW()) - YEAR(purchase_date)))'
}

如果值公式得出的值是 -ve,我需要将值声明为 0。 我该怎么做,是在控制器中还是在域中?

我在 Controller 中试过了

@Transactional
def value() {
    Asset asset = Asset.get(params.value)
    if (params.value <= 0) {
        params.value = 0
        return
    }
}

嗯!现在我无法尝试我给你的建议,但在 grails 文档中很好地说,公式使用持久性模型而不是对象模型,因此它也允许添加 hql 查询。

因此,您可以尝试使用 hql 查询 CASE 语句。

This blog很好地展示了使用hql的例子。

以下内容适合您的情况:

static mapping = {
    yearNow formula: 'YEAR(purchase_date)'
    yearlyValue formula: 'PURCHASE_AMOUNT / LIFE_EXPECTANCY'
    value formula: 'CASE WHEN PURCHASE_AMOUNT / LIFE_EXPECTANCY * (LIFE_EXPECTANCY - (YEAR(NOW()) - YEAR(purchase_date))) <0 THEN PURCHASE_AMOUNT / LIFE_EXPECTANCY * (LIFE_EXPECTANCY - (YEAR(NOW()) - YEAR(purchase_date))) ELSE 0'

此外,另一个解决方案如果您不想对您的公式使用查找器或标准查询,是为瞬态 属性 并得到如下所示的预期值:

public double getValue(){
    double value = 0.0d //calculate value here
    return  (value <0 ? 0 : value)
} 

希望对您有所帮助!!

只需覆盖域内 value 的 getter 方法来检查 -ve 值。

public double getValue(){
    value < 0 ? 0 : value
}

感谢帮助,答案是

 value formula: 'GREATEST(PURCHASE_AMOUNT / LIFE_EXPECTANCY * (LIFE_EXPECTANCY - (YEAR(NOW()) - YEAR(purchase_date))), 0)'