Критерии гибернации - выбран один объект
Вопрос
Я работаю над проектом 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 р>
Другие советы
Два быстрых наблюдения:
<Ол> eqId ()
- см. createCriteria id и версия - это специальные свойства всех классов GORM. Вам не нужно указывать их в объявлении класса, и вы не можете использовать стандартный критерий с ними.
Вам определенно нужно использовать критерий eqID
def query = {
owners {
eqId(Long.parseLong(params.ownerId))
}
}
def criteria = ClientContact.createCriteria()
def results = criteria.list(params, query)