Grails: проблема с вложенными ассоциациями в построителе критериев - PullRequest
4 голосов
/ 16 марта 2010

У меня неприятная проблема с построителем критериев. У меня есть приложение, в котором у одного пользователя есть один календарь, а в календаре много записей. Это кажется достаточно простым, но когда я пытаюсь получить записи календаря для данного пользователя, я не могу получить доступ к свойству пользователя (MissingMethodException). Вот код:

def getEntries(User user) {
  def entries = [ClassName].createCriteria().list() {
    calendar {
      user {
        eq("id", user.id)
      }
    }
  }
}

Я даже попробовал следующий вариант:

def getEntries(User user) {
  def entries = [ClassName].createCriteria().list() {
    calendar {
      eq("user", user)
    }
  }
}

Это не вызвало исключения, но и не сработало.

Вот соответствующие части классов домена:

class Calendar {
    static belongsTo = [user: User]
    static hasMany = [entries: Entries]

    ...
}

class User {
    Calendar calendar

    ...
}

class Entry {
    static belongsTo = [calendar: Calendar]

    ...
}

При поиске в Google я столкнулся с аналогичной проблемой, отмеченной в начале 2008 года: http://jira.codehaus.org/browse/GRAILS-1412

Но по этой ссылке эта проблема должна была быть решена давно.

Что я делаю не так?

Ответы [ 5 ]

10 голосов
/ 01 ноября 2010

Я наконец нашел ошибку !! Ошибка не была связана с критерием построения. Проблема в этом случае заключалась в том, что у меня была переменная пользователя в области видимости, поэтому, когда я пытался ввести отношение пользователя с помощью

calendar {
  user {
    eq("id", user.id)
  }
}

Граилс подумал, что я хочу вызвать пользовательский объект / переменную с замыканием. Я снова могу свободно использовать критерии построения: -)

Спасибо за вашу помощь и предложения, ребята!

3 голосов
/ 01 сентября 2014

Если у вас есть такие объемные ошибки, как постер вопроса, вы всегда можете сделать следующее.Допустим, у вас есть переменная пользователя в вашей области, а затем используйте

def user = User.get(...)
...
calendar {
  'user' {
    eq("id", user.id)
  }
}

вместо

def user = User.get(...)
...
calendar {
  user {
    eq("id", user.id)
  }
}
1 голос
/ 17 марта 2010

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

Вы можете просто использовать HQL для своего запроса, который я считаю более естественным для написания и более легким для анализа, поскольку я привык выглядеть как SQL.

Вот ваш запрос на HQL:

Entry.executeQuery("from Entry e where e.calendar.user.id = :userId", [userId: theUser.id])
0 голосов
/ 24 октября 2010
def entries = Entries.createCriteria().list() {

Почему вы написали Записи ? Ваше имя класса Entry . Поэтому я бы сказал, что ваша строка должна выглядеть так:

def entries = Entry.createCriteria().list() {
0 голосов
/ 17 марта 2010

Вот вещь

def getEntries(User user) {
 def entries = Entries.createCriteria().list() {
          calendar { 
             user { 
              eq("id", user.id)
             }
          } 
      }  
}
...