propertyMissing在Criteria中不起作用?

时间:2014-03-14 23:11:00

标签: grails named-query

所以我有几个课程有以下关系:

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:/

要回答dmahapatroquestion,我正在使用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的结果。)

1 个答案:

答案 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)
    }
}
相关问题