Grails Many-To-Many - Проблемы динамического поиска

Я надеюсь, что вы можете помочь мне, ребята. К сожалению, Google не помог мне, и мой поиск здесь, в stackoverflow, тоже не помог :-(

У меня есть два класса доменов HumanResource и Task с отношением "многие ко многим".

Определения моделей:

Задача:

class Tasks {

    String name

    static belongsTo = [HumanResource]
    static hasMany = [humanResources: HumanResource]
    //also tried but didn't help -> static fetchMode = [humanResources:"eager"]
}

Человеческий ресурс:

class HumanResource {

    String name

    static hasMany = [tasks: Tasks]

}

Я также пытался добавить индекс в поле id с помощью mapping={}, но я также думаю, что это не решение, это не помогло, и я думаю, что в поле id уже есть индекс.

Итак, что я сделал и не работает, так это найти все человеческие ресурсы для поставленных задач! И задачи поступают из Сервисов, и они уже получены в сервисной модели с помощью «static fetchMode = [tasks:« нетерпеливый »]»!

Код контроллера:

def listHumanResourcesFromTasks = {
        def list = HumanResource.findAllByTasks(service.getTasks())

        //and I tried also with an own HashMap but didn't work as well

}

Я всегда получаю сообщение об ошибке "org.springframework.dao.InvalidDataAccessResourceUsageException" с исключением SQL-GrammarException. Но я действительно не знаю, почему. Объекты "service.getTasks()" полностью заполнены (как я писал с fetchMode = [tasks:"eager"])...

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

Большое спасибо за ваше время.

С наилучшими пожеланиями,

Марко


person grailsInvas0r    schedule 31.07.2011    source источник


Ответы (1)


Этот тип запроса не поддерживается — вам нужно будет использовать HQL или запрос с критериями в целом. Но этот конкретный вариант прост, поскольку у вас двунаправленные отношения. Вы можете получить все экземпляры HumanResource для коллекции Tasks следующим образом:

def resources = service.getTasks().collect { it.humanResources }.flatten() as Set

Это должен быть Set, поскольку один и тот же экземпляр HumanResource может появляться несколько раз, поэтому вам нужно сжать список до уникальных экземпляров.

person Burt Beckwith    schedule 31.07.2011
comment
Эй, Берт, большое спасибо, это работает! Но у меня есть постоянный вопрос. Если я использую ваше решение, модель HumanResource будет заполнена полностью, и будет выполнено множество ненужных выборок гибернации. Как я могу исключить это с помощью вашего решения или как я могу делегировать, что собирать с помощью вашего решения? Я попробовал def resources = service.getTasks().collect{humanResources.id; HumanResources.firstName; humanResources.lastName}.flatten() как Set, но с этим я получаю (в случае 5 ресурсов) 15 результатов, неупорядоченных и не связанных друг с другом :-( Можете ли вы дать мне подсказку? Еще раз спасибо! Марко - person grailsInvas0r; 01.08.2011