如何在Grails Criteria中使用嵌套属性和类中的属性?

时间:2016-11-07 23:12:43

标签: grails gorm criteria

我遇到这种情况:

country {
    and {
        rates{
                                and{
                                    between('effectiveDate', startDate, endDate)
                                    or {
                                        and {
                                            eq('hoursEligible', true)
                                            gt('hours', new BigDecimal(0))
                                        }
                                        and {
                                            eq('travelTimeEligible', true)
                                            gt('travel', new BigDecimal(0))
                                        }
                                        and {
                                            eq('mileageEligible', true)
                                            gt('mileage', new BigDecimal(0))
                                        }
                                        and {
                                            eq('expensesEligible', true)
                                            gt('expenses', new BigDecimal(0))
                                        }
                                    }
                                }
                            }
    }
    }

事情是:hours是特定类的属性,具有此命名查询的类。而rate是一个嵌套在我特定类的嵌套对象之一的列表。 当我尝试使用它时,我得到了:

java.lang.IllegalArgumentException: object is not an instance of declaring class

如何使用此命名查询引用hours属性? 还有一个问题......如果费率列表中的任何项目对于此条件返回true,它将返回true,对吗?

这是我的域类:

class TravelDetail {

    Date date
    Country country
    BigDecimal hours
    BigDecimal mileage
    BigDecimal travel
    BigDecimal expenses

进入我所拥有的国家:

class Country {

static hasMany = [rates: Rate

进入Rate我有:

class Rate {

    Boolean hoursEligible = Boolean.TRUE
        Boolean travelTimeEligible = Boolean.TRUE
        Boolean mileageEligible = Boolean.TRUE
        Boolean expensesEligible = Boolean.TRUE

2 个答案:

答案 0 :(得分:0)

将每个rate中的and条件拆分,类似这样,

country {
    and {
        between('effectiveDate', startDate, endDate)
        or {
            and {
                rates {eq('hoursEligible', true)}
                gt('hours', new BigDecimal(0))
            }
            .
            .
            and {
                rates {eq('expensesEligible', true)}
                gt('expenses', new BigDecimal(0))
            }
        }
    }
}

答案 1 :(得分:0)

我不认为,我会采用像你这样的模型,但通常查询应该是这样的(假设你在TravelDetails上调用它):

def list = TravelDetail.withCriteria{
  between 'effectiveDate', startDate, endDate
  or {
     and {
         country{ rates { eq 'hoursEligible', true } }
         gt 'hours', 0
     }
     ....
   }
}