Grails фильтрует класс домена по свойству другого домена

У меня есть приложение Grails, и я хочу создать фильтры для своего класса домена, используя named query.
У меня есть домены Act и Status, StatusName — это Enum:

class Act {
    static hasMany = [status : Status]
}

class Status {
    Date setDate
    StatusName name
    static belongsTo = [act : Act]
}

Я хочу отфильтровать действия, у которых имя последнего статуса равно определенному имени.
На данный момент у меня есть этот код в Act:

static namedQueries = {
    filterOnStatus { StatusName s ->
        status {
            order('setDate', 'desc')
            eq 'name', s
            // I need only first Status, with most recent setDate
            // among all Statuses of that Act
        }
    }
}

Но это отфильтровывает все действия, которые имеют статус с определенным именем, а не только самые последние. Я попытался поместить maxResult 1 в запрос, но, похоже, это не сработало.
Буду признателен за любую помощь.

EDIT: Проблема была решена таким образом:

filteronStatus {
    createAlias('status', 's1')
    eq 's1.name', s
    eq 's1.setDate', new DetachedCriteria(Status).build {
        projections {
            max('setDate')
            eqProperty('act', 's1.act')
        }
    }
}

person TulaGingerbread    schedule 02.10.2013    source источник
comment
Что вы имеете в виду под самым последним? Вам нужно добавить дату к аргументам именованного запроса. Если setDate больше этой даты, статус находится в вашем последнем диапазоне.   -  person rxn1d    schedule 02.10.2013
comment
Act имеет несколько статусов. Каждый Status имеет дату (setDate), когда он был установлен. Самый последний статус означает Status с самым последним setDate среди всех статусов.   -  person TulaGingerbread    schedule 02.10.2013


Ответы (1)


см. 'namedQueries' из документа Grails

// получить одно недавнее действие

def recentAct = Act.filterOnStatus(statusName).get()

ДОБАВИТЬ:

HQL

"select s1.act from Status as s1 \
            where s1.name = :statusName \
            and s1.setDate = (select max(s0.setDate) from s1.act.status s0)"

Именованный запрос

listByStatus { statusName ->
            createAlias('status', 's1')
            eq 's1.name', statusName
            eq 's1.setDate', new DetachedCriteria(Status).build{ projections { max('setDate')} eqProperty('act','s1.act') }
        }
person Olencha    schedule 02.10.2013
comment
Мне не нужен один недавний акт, мне нужны все акты, которые удовлетворяют критерию «самый последний статус этого акта имеет StatusName, равный указанному». Код, который вы предлагаете, дает мне один акт с самым последним статусом из всех. - person TulaGingerbread; 02.10.2013
comment
def недавний акт = Act.filterOnStatus(statusName)..listDistinct() - person Olencha; 02.10.2013
comment
попробуйте определить недавний акт = Act.filterOnStatus(statusName).listDistinct(). В любом случае предлагаю использовать модель: Act{ Status lastStatus }; - person Olencha; 02.10.2013
comment
Да, я думал добавить новое поле в Act. Но я сделаю это, только если буду уверен, что нет другого способа это исправить. И listDistinct() это не способ ее решить - person TulaGingerbread; 02.10.2013