Критерии гибернации - выбран один объект - PullRequest
3 голосов
/ 01 ноября 2008

Я работаю над проектом 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 () , поскольку она предоставляет некоторые приятные функции подкачки.

Ответы [ 3 ]

3 голосов
/ 27 января 2012

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

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

0 голосов
/ 23 ноября 2008

id и версия - это специальные свойства всех классов GORM. Вам не нужно указывать их в объявлении класса, и вы не можете использовать с ними стандартный критерий.

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

   def query = {
          owners {
                eqId(Long.parseLong(params.ownerId))
          }
   }
   def criteria = ClientContact.createCriteria()
   def results = criteria.list(params, query)
0 голосов
/ 01 ноября 2008

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

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