项目使用的Mysql + Hibernate框架,最近用到了按中文排序,按照之前英文排序的方法,发现结果不成功,原来Mysql中utf8mb4编码的数据按中文排序要先转GBK,
SELECT *
FROM mb_member t
WHERE 1=1
ORDER BY CONVERT(full_name USING gbk) asc
这样排出来的结果就完全按照中文来排序了,但是如果直接把convert放到Hibernate的HSQ中,肯定是不行的,会报“unexpected token: USING”错误。
这就需要在Mysql的方言中注册一个方法,共两步:
一、继承 MySQL57InnoDBDialect 写下自己的方言类
import org.hibernate.dialect.MySQL57InnoDBDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StringType;
public class MySQLLocalDialect extends MySQL57InnoDBDialect {
public MySQLLocalDialect(){
super();
registerFunction("convert",new SQLFunctionTemplate(StringType.INSTANCE, "convert(?1 using ?2)") );
}
}
二、修改Hibernate配置方言指向自己的方言类
至此就可以了,使用时: convert(t.fullName , 'gbk') 会自己转换为 convert(full_name USING gbk)
SELECT DISTINCT t FROM MbMemberEntity t WHERE 1=1 ORDER BY convert(t.fullName , 'gbk') asc
解决问题中要感谢以下博客:
1. http://liugang-ok.iteye.com/blog/1167859
2. http://blog.csdn.net/zhichao2001/article/details/11721325
3. http://www.iteye.com/problems/94206