Критерии Грааля для списков в домене - PullRequest
2 голосов
/ 05 декабря 2011

У меня есть класс домена League.Каждая лига имеет heightNumber, представляющую высоту лиги (например: 1 = "первая лига, 2 =" вторая лига ") и widthNumber, представляющую одни и те же высшие лиги. Итак, скажем, лига с высотой 3 и шириной 2можно рассматривать как «3.лига B.». Лига имеет от 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"))
    }
}

Iзнаю, что приведенный выше код не возвращает желаемую Лигу.

Мой Лига 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
    }
}

этот код сейчасработает для меня, но я думаю, что это совершенно бесполезно. Было бы здорово, если кто-то может мне помочь.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

Я не уверен на 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 не поддерживают их.

0 голосов
/ 05 декабря 2011

Я бы предложил использовать более гибкий 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")
...