如何通过字母数字(字符串)属性 更正排序域 class?
How to correct sort domain class by an alphanumeric (String) property?
当我按字母数字 属性 对域 Class 进行排序时,当值以数字开头时,排序顺序不是预期的。示例:
class MyDomainClass {
String descr
}
MyDomainClass.createCriteria().list() {
order("descr", "asc")
}.each { it ->
println it.descr
}
如果 table 包含这 3 个值:
- AAA
- 111
- BBB
打印结果为:
- AAA
- BBB
- 111
但我想要的是(同数据库查询结果):
- 111
- AAA
- BBB
有没有我可以定义它的配置?
我意识到问题的发生是由于 NLS_SORT parameter on Oracle DB being changed to WEST_EUROPEAN
when my application sets the locale to pt_BR
(because this is the default sorting for this locale according Oracle's documentation). So I realized I can define a custom sorter using NLSSORT 必要时的功能:
select ret
from ( select 'AAA' as ret from dual
union
select '111' as ret from dual
union
select 'BBB' as ret from dual)
ORDER BY NLSSORT(ret, 'NLS_SORT = BINARY');
在圣杯中:
println ' --- With WEST_EUROPEAN sort ---'
MyDomain.executeQuery("SELECT m FROM MyDomain as m ORDER BY NLSSORT(descr, 'NLS_SORT = WEST_EUROPEAN')").each {
println it.descr
}
println ' -- With BINARY sort ---'
MyDomain.executeQuery("SELECT m FROM MyDomain as m ORDER BY NLSSORT(descr, 'NLS_SORT = BINARY')").each {
println it.descr
}
输出:
--- With WEST_EUROPEAN sort ---
AAA
BBB
111
--- With BINARY sort ---
111
AAA
BBB
当我按字母数字 属性 对域 Class 进行排序时,当值以数字开头时,排序顺序不是预期的。示例:
class MyDomainClass {
String descr
}
MyDomainClass.createCriteria().list() {
order("descr", "asc")
}.each { it ->
println it.descr
}
如果 table 包含这 3 个值:
- AAA
- 111
- BBB
打印结果为:
- AAA
- BBB
- 111
但我想要的是(同数据库查询结果):
- 111
- AAA
- BBB
有没有我可以定义它的配置?
我意识到问题的发生是由于 NLS_SORT parameter on Oracle DB being changed to WEST_EUROPEAN
when my application sets the locale to pt_BR
(because this is the default sorting for this locale according Oracle's documentation). So I realized I can define a custom sorter using NLSSORT 必要时的功能:
select ret
from ( select 'AAA' as ret from dual
union
select '111' as ret from dual
union
select 'BBB' as ret from dual)
ORDER BY NLSSORT(ret, 'NLS_SORT = BINARY');
在圣杯中:
println ' --- With WEST_EUROPEAN sort ---'
MyDomain.executeQuery("SELECT m FROM MyDomain as m ORDER BY NLSSORT(descr, 'NLS_SORT = WEST_EUROPEAN')").each {
println it.descr
}
println ' -- With BINARY sort ---'
MyDomain.executeQuery("SELECT m FROM MyDomain as m ORDER BY NLSSORT(descr, 'NLS_SORT = BINARY')").each {
println it.descr
}
输出:
--- With WEST_EUROPEAN sort ---
AAA
BBB
111
--- With BINARY sort ---
111
AAA
BBB