子查询

时间:2017-07-03 16:38:56

标签: mysql grails gorm criteria

让我们假设以下Grails域:

Owner {
 String name
 static hasMany [cars: Cars]
}

Car {
 Date inspectionDate
}

我希望能够通过条件搜索Owner s ,并遵循以下规则: Car中的inspectionDate Owner { {1}}的汽车列表低于*given date*

作为示例,我想将以下代码应用于GORM中的选择查询:

queryResultsList = allOwnersList.filter { owner -> 
    owner.cars.min{ car -> car.inspectionDate }.inspectionDate < myDate
}

我需要使用Criteria来实现它,因为我已经在其他字段上过滤Owner了。 以整个给定的代码为例,原始代码的某些部分已被省略,源代码不是关于汽车和所有者。

首先想到我认为我需要SQL中的子查询来检索我预期的数据,我尝试了以下内容:

Owner.createCriteria().list {
    // [...] some filters on other fields 
    cars {
        lt('inspectionDate', params.inspectionDate)

        'in'('inspectionDate', new grails.gorm.DetachedCriteria(Owner).list {
            projections {
                cars {
                    min('inspectionDate')
                }
            }
        })
    }
}

我还尝试在投影中的不同位置添加groupProperty,以MissingPropertyException结尾。

我正在使用Grails 2.2.4

1 个答案:

答案 0 :(得分:0)

经过几天测试解决方案后,我来到了以下方面:

#panel

然而,我仍然觉得做错了。特别是,Owner.createCriteria().list { // [...] some filters on other fields cars { lt('inspectionDate', params.inspectionDate) 'in'('inspectionDate', Owner.createCriteria().list { projections { cars { min('inspectionDate') } groupProperty 'id' } // this allows to only get first property, which is inspectionDate }.collect { it[0] }) } } 部分看起来像代码气味。

我发布这个是因为它做了我需要的事情,但是对于找到好的解决方案的任何帮助都将不胜感激。