Criteria API动态排序

时间:2016-04-13 08:31:50

标签: hibernate grails criteria

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

现在我遇到问题来解决不在Criteria所在的类中的给定排序属性。

例如: 我有一个Foo类,其中包含一个属性Bar bar,而Bar有一个属性String name。现在我想对Bar的名称进行排序,因此我将作为排序参数进入Service 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)
            }
        } 
}

这不起作用:(

任何建议我如何才能完成这项工作?

1 个答案:

答案 0 :(得分:0)

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

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)
            }
        } 
}