Hibernate 标准API动态排序

Hibernate 标准API动态排序,hibernate,grails,criteria,Hibernate,Grails,Criteria,我试图在Grails2.4.3中设置一个动态搜索服务,以便将其用于所有域类搜索 现在我要解决的问题是,给定的sort属性不在启用条件的类中 例如: 我有一个Foo类,它包含一个属性Bar,而Bar具有属性字符串名。现在我想在Bar的名称之后进行排序,因此我将使用服务Bar.name作为排序参数 现在,我必须动态解析这个排序参数,我还可以使用类似于world.name的东西 我发现: 我试图使其动态化,以下是我方法的一部分: def c = domainClass.createCriteria()

我试图在Grails2.4.3中设置一个动态搜索服务,以便将其用于所有域类搜索

现在我要解决的问题是,给定的sort属性不在启用条件的类中

例如: 我有一个
Foo
类,它包含一个属性
Bar
,而Bar具有属性
字符串名
。现在我想在Bar的名称之后进行排序,因此我将使用服务
Bar.name
作为排序参数

现在,我必须动态解析这个排序参数,我还可以使用类似于
world.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)
            }
        } 
}
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)
            }
        } 
}