【问题标题】:GORM criteria group by in subquery子查询中的 GORM 标准分组依据
【发布时间】:2017-12-07 00:16:19
【问题描述】:

让我们假设以下 Grails 域:

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

Car {
 Date inspectionDate
}

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

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

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

我需要使用 Criteria 来实现它,因为我已经在其他字段上过滤 Owners。 给出的全部代码仅作为示例,部分原代码已被省略,源代码与汽车和车主无关。

一开始我以为我需要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

【问题讨论】:

    标签: mysql grails grails-orm criteria


    【解决方案1】:

    经过几天的测试解决方案,我得出了以下一个:

    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] })
        }
    }
    

    但是,我仍然觉得做错事了。特别是,collect 部分看起来像代码味道。

    我发布这个是因为它可以满足我的需要,但是对于找到好的解决方案的任何帮助将不胜感激。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多