我有域类League
。每个联赛都有一个代表联赛高度的heightNumber
(例如:1 ="第一联赛,2 ="第二联赛")和一个代表相同高度联赛的widthNumber
。假设一个高3宽2的联赛可以看成是"3"。联赛B"。A联赛有0到16支球队。我试着找到best(min(heightNumber)
和min(widthNumber)) League
有免费的团队插槽(teams.size()<16)
def league = League.withCriteria(uniqueResult:true){
sizeLt("teams", 16)
and {
eq(heightNumber, min("heightNumber"))
eq(widthNumber, min("widthNumber"))
}
}
我知道上面的代码不会返回期望的联赛。
My League Domainclass:
class League {
String leagueName
int heightNumber
int widthNumber
static hasMany = [teams:Team]
static constraints = {
teams(size:0..16)
heightNumber min:1
widthNumber min:1
}
}
换句话说,我需要:
def leagues = League.withCriteria{
and {
order('heightNumber', 'asc')
order('widthNumber', 'asc')
}
}
for(League l : leagues){
if(l.teams.size()<16){
return l
}
}
这段代码现在为我工作,但我认为它是相当不性能。如果有人能帮我就太好了。
我建议使用更灵活的hql。我希望这对你有用,没有测试:
League.executeQuery("select distinct l from League as l where (select min(heightNumber) from League) = l.heightNumber and (select min(widthNumber) from League) = l.widthNumber and l.teams < 16")
我不是100%确定你到底想做什么,但也许这可以帮助:这里是一个查询,输出联赛最小的widthNumber
,在所有联赛中,有最小的heightNumber
。
League.find("from League as l
where l.teams < 16 and
l.heightNumber = (select min(heightNumber)
from League)
order by l.widthNumber asc")
使用条件执行此操作涉及子查询,这有点冗长,因为Grails标准DSL不支持子查询。