条件 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)
}
}
}
我正在尝试在 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)
}
}
}