Решение createAlias ​​() для возврата всех связанных строк работает не во всех случаях - PullRequest
2 голосов
/ 15 апреля 2011

Предполагается, что следующие доменные объекты:

UserChallenge {
  String invitationKind
}

ChallengeGroup {
  UserChallenge challenge
  UserGroup group
}

UserGroup {
  name
}

Следующий запрос возвращает вызовы с ассоциацией групп, которая частично заполнена соответствующими группами:

UserChallenge.withCriteria {
  eq('invitationKind', 'GROUP')
  groups {
    'in'('group.id', visibleGroupIds)
  }
}

В сообщении http://adhockery.blogspot.com/2009/06/querying-by-association-redux.html он предлагает использовать createAlias ​​() и модифицировать запрос выше, похоже, работает:

UserChallenge.withCriteria {
  eq('invitationKind', 'GROUP')
  createAlias('groups', 'g')
  'in'('g.group.id', visibleGroupIds)
}

Однако следующее не работает:

UserChallenge.withCriteria {
  or {
    eq('invitationKind', 'OPEN')
    and {
      eq('invitationKind', 'GROUP')
      createAlias('groups', 'g')
      'in'('g.group.id', visibleGroupIds)
    }
  }
}

И возвращает только проблемы с соответствиемвидимые группы идентифицируют не проблемы, которые являются «открытыми».Кажется, не имеет значения, куда вы положили вызов createAlias ​​().

Работает следующее:

UserChallenge.withCriteria {
  or {
    eq('invitationKind', 'OPEN')
    and {
      eq('invitationKind', 'GROUP')
      groups {
        'in'('group.id', visibleGroupIds)
      }
    }
  }
}

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

1 Ответ

2 голосов
/ 27 октября 2016

Хотя вопрос старый, любой, столкнувшийся с такой же проблемой, может найти его полезным.Использование отдельного критерия запроса - еще одна идея для его достижения.В соответствии с информацией, представленной в вопросе, я пытался выполнить его, используя отдельный критерий.Подробнее о критериях здесь

def userGroup = new DetachedCriteria(UserGroup).build {
        eq("group.id", visibleGroupIds)
    }
    def getOb = UserChallenge.createCriteria()
    def listReturned = getOb.list {
        or{
            eq('invitationKind', 'OPEN')
            and {
                eq('invitationKind', 'GROUP')
                "groups" {
                    userGroup
                }
            }
        }
    }``
...