所以我有几个课程有以下关系:
class Foo {
Bar bar
/* ... other fields ... */
}
class Bar {
String name
}
在课程Foo
中,我有几个命名查询:
static namedQueries = {
userFoos { user ->
/* ... get Foos for this user ... */
}
limitFoos { colname, dir ->
order(colname, dir)
}
...然后我可以在控制器中链接在一起:
def foos = Foo.userFoos(currentUser).limit(colname, dir)
到目前为止非常简单。问题是当我尝试对bar
进行排序时;我收到错误:
could not resolve property: bar.name of: package.Foo.
现在,当查询是在控制器中声明的Criteria时,我也遇到了这个错误。所以,我去为propertyMissing
写了一个Foo
处理程序:
def propertyMissing(String name) {
if (name.contains(".")) {
def (String propertyname, String subproperty) = name.tokenize(".")
if (this.hasProperty(propertyname) && this."$propertyname".hasProperty(subproperty)) {
return this."$propertyname"."$subproperty"
}
}
}
我不知道这是否真的是最好的方法,但确实有效!但是,现在我已将查询作为命名查询移到了类中,propertyMissing
似乎不再起作用了!这种用途是不受支持的,还是我在这里遗漏了什么?
修改
所以我尝试将Criteria移回控制器,果然,子属性排序也不起作用!所以我猜Criteria根本不支持propertyMissing
:/
要回答dmahapatro的question,我正在使用jQuery DataTables来提供相关信息。单击列标题会对控制器操作执行AJAX调用,并使用参数指示要排序的列以及在哪个方向上排序。确定列名后,我会像这样调用命名查询:
def foosFilteredLimited = params.sSearch ?
Foo.userFoos(currentUser).filterFoos(params.sSearch).limitFoos(offset, max, colName, sortDir).list()
: Foo.userFoos(currentUser).limitFoos(offset, max, colName, sortDir).list()
(filterFoos
采用搜索字符串并缩小userFoos
的结果。)
答案 0 :(得分:2)
尝试修改limitFoos
namedQuery,如下所示,它应该可行。但是有一点需要注意。如果需要,我们无法使用bar.baz.name
。 ;)
limitFoos { column, ord ->
def colStrs = column.tokenize(/./).toList()
if( colStrs?.size() > 1 ) {
"${colStrs[0]}" {
order( "${colStrs[1]}", ord )
}
} else {
order(column, ord)
}
}