条件 API 动态排序

Criteria API dynamically sorting

我正在尝试在 Grails 2.4.3 中设置动态 SearchService 以将其用于所有域 Class 搜索。

现在我要解决给定排序 属性 的问题,这些排序 属性 不在条件开启的 class 中。

例如: 我有一个 Foo Class,其中包含一个 属性 Bar bar,Bar 有 属性 String name。现在我想按 Bar 的名称排序,所以我进入服务 bar.name 作为排序参数。

现在我必须动态解析这个排序参数,我也可以使用类似 world.name.

的东西

我找到了 this :

def criteria = Child.createCriteria();
println criteria.list{
    parent {
        order("name")
    }
}

我试着让它动态化,这是我方法的一部分:

def c = domainClass.createCriteria()
def list = c.listDistinct {
        if (sort) {
            if (sort.contains('.')) {
                String[] splittedSort = sort.tokenize('.')
                sort = splittedSort.last()
                splittedSort = splittedSort[0..-2]

                splittedSort[0].toString() {
                    order(sort, sortorder)
                }
            } else {
                order(sort, sortorder)
            }
        } 
}

这不起作用:(

有什么关于如何完成这项工作的建议吗?

您可以使用条件查询别名,而不是尝试通过动态名称调用方法。像这样:

def c = domainClass.createCriteria()
def list = c.listDistinct {
        if (sort) {
            if (sort.contains('.')) {
                String[] splittedSort = sort.tokenize('.')
                sort = splittedSort.last()
                splittedSort = splittedSort[0..-2]

                createAlias(splittedSort.join('.'), 'sortAlias')
                order("sortAlias.${sort}", sortorder)
            } else {
                order(sort, sortorder)
            }
        } 
}