我对条件构建器有一个令人沮丧的问题。我有一个应用程序,其中一个用户有一个日历,日历有许多条目。看起来很简单,但是当我尝试获取给定用户的日历条目时,我无法访问用户属性(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
但根据该链接,这个问题早就应该解决了。
我做错了什么?
答案 0 :(得分:10)
我终于找到了错误!!该错误与标准构建器完全无关。这种情况下的问题是我在范围内有用户变量,所以当我尝试通过
输入用户关系时calendar {
user {
eq("id", user.id)
}
}
Grails认为我想用一个闭包来调用用户对象/变量。我可以再次自由地使用标准构建器: - )
感谢您的所有帮助和建议!
答案 1 :(得分:3)
如果您遇到类似问题海报的范围错误,您始终可以执行以下操作。假设您的范围中有一个用户变量,然后使用
def user = User.get(...)
...
calendar {
'user' {
eq("id", user.id)
}
}
而不是
def user = User.get(...)
...
calendar {
user {
eq("id", user.id)
}
}
答案 2 :(得分:1)
我不确定为什么你的标准不起作用。我总是遇到一些问题让他们工作得很好,发现它们比HQL更加繁琐。
你可以只使用HQL进行查询,我发现它更自然易于解析,因为我习惯于查看SQL。
以下是您在HQL中的查询:
Entry.executeQuery("from Entry e where e.calendar.user.id = :userId", [userId: theUser.id])
答案 3 :(得分:0)
这是一件事
def getEntries(User user) {
def entries = Entries.createCriteria().list() {
calendar {
user {
eq("id", user.id)
}
}
}
}
答案 4 :(得分:0)
def entries = Entries.createCriteria().list() {
为什么你写了条目?您的班级名称是条目。 所以我想说你的专栏应该是:
def entries = Entry.createCriteria().list() {