4

我对标准构建器有一个令人沮丧的问题。我有一个应用程序,其中一个用户有一个日历,一个日历有很多条目。看起来很简单,但是当我尝试获取给定用户的日历条目时,我无法访问用户属性(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]

    ...
}

谷歌搜索时,我遇到了 2008 年初注意到的类似问题:http: //jira.codehaus.org/browse/GRAILS-1412

但是根据那个链接,这个问题应该早就解决了。

我究竟做错了什么?

4

5 回答 5

10

我终于找到错误了!!该错误与标准构建器完全无关。这种情况下的问题是我在范围内有用户变量,所以当我尝试通过以下方式输入用户关系时

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

Grails 认为我想用闭包调用用户对象/变量。我可以再次自由地使用标准构建器:-)

感谢您的所有帮助和建议!

于 2010-11-01T13:40:08.090 回答
3

如果您有像问题海报这样的范围错误,您总是可以执行以下操作。假设您的范围中有一个用户变量,然后使用

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

代替

def user = User.get(...)
...
calendar {
  user {
    eq("id", user.id)
  }
}
于 2014-09-01T14:10:39.583 回答
1

我不确定为什么您的标准不起作用。我一直在让它们正常工作并且发现它们比 HQL 更复杂时遇到一些问题。

您可以只使用 HQL 进行查询,因为我习惯于将其视为 SQL,所以我发现它更自然地编写并且更容易解析。

这是您在 HQL 中的查询:

Entry.executeQuery("from Entry e where e.calendar.user.id = :userId", [userId: theUser.id])
于 2010-03-17T02:25:52.130 回答
0

这是一件事

def getEntries(User user) {
 def entries = Entries.createCriteria().list() {
          calendar { 
             user { 
              eq("id", user.id)
             }
          } 
      }  
}
于 2010-03-17T05:59:49.310 回答
0
def entries = Entries.createCriteria().list() {

你为什么写词条?您的班级名称是Entry。所以我想说你的 Line 应该是:

def entries = Entry.createCriteria().list() {
于 2010-10-24T18:54:41.553 回答