2017-07-03 81 views
0

假設下面的Grails域名:最近Car通過inspectionDateGORM標準組在子查詢

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

Car { 
Date inspectionDate 
} 

我希望能夠搜索Owner小號通過標準,有以下規則Owner的車輛列表低於*given date*

舉個例子,我想下面的代碼適用於選擇查詢在GORM:

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

我需要使用標準,因爲我已經在過濾等領域Owner s到實現這一目標。 以整個給定的代碼爲例,原始代碼的某些部分已被忽略,源代碼不是關於汽車和所有者的。

上的第一個想法我認爲我需要一個子查詢中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

回答

0

經過幾天的測試解決方案,我得出以下之一:

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部分看起來像代碼味道。

我張貼這一點,因爲它做什麼,我需要,但是找到一個好的解決任何幫助,將不勝感激。