Вопрос

Я работаю над проектом Grails с использованием Hibernate (GORM). У меня есть следующие доменные модели:

ClientContact {
   static hasMany = [owners: Person]
   static belongsTo = [Person]
}

Person {
   static hasMany = [clientContacts: ClientContact]
}

Когда я пытаюсь получить все ClientContacts с определенным владельцем ( Person ), я сталкиваюсь с некоторыми забавными проблемами. Я использую следующие критерии запроса:

def query = {
   owners {
      eq("id", Long.parseLong(params.ownerId))
   }
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query) 

Проблема заключается в том, что, когда я перебираю каждый из ClientContacts в результатах, у них есть только один владелец , хотя на самом деле у большинства есть много других владельцев. Что дает? Я знаю, что hibernate / GORM использует ленивую выборку, но я думал, что при попытке получить к ним доступ все остальные владельцы ClientContact .

Есть мысли? Я хотел бы продолжить использование функции list () , поскольку она предоставляет некоторые приятные функции подкачки.

Это было полезно?

Решение

Я знаю, что этот поток очень старый, но сегодня я столкнулся с точно такой же проблемой, и решение, похоже, заключается в использовании псевдонимов, поэтому вместо этого:

def query = {
        owners {
                eq("id", Long.parseLong(params.ownerId))
        }
}

можно попробовать:

def query = {
        createAlias("owners", "o")
        eq("o.id", Long.parseLong(params.ownerId))
}

Первый запрос создает левые внешние объединения, а второй создает внутренние объединения. Пожалуйста, смотрите эту ссылку для более подробного описания: http: // adhockery. blogspot.com/2009/06/querying-by-association-redux.html

Другие советы

Два быстрых наблюдения:

<Ол>
  • [Документация Grails] ( http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.2.1.3 Many-to- many) говорит, что связь многие-ко-многим должна быть закодирована вручную, стандартные леса не будут этого делать.
  • Вам может понадобиться использовать критерий eqId () - см. createCriteria
  • id и версия - это специальные свойства всех классов GORM. Вам не нужно указывать их в объявлении класса, и вы не можете использовать стандартный критерий с ними.

    Вам определенно нужно использовать критерий eqID

       def query = {
              owners {
                    eqId(Long.parseLong(params.ownerId))
              }
       }
       def criteria = ClientContact.createCriteria()
       def results = criteria.list(params, query)
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top