我们使用mysql的时候常常会遇见直接通过order by对某个字段排序时有中文的时候就会出现错误。但是我们可以使用convert解决问题。
直接sql语句【错误】:select * from user order by username .这个时候如果username有中文则排序不准确。
直接sql语句【正确】:select * from user order by convert(username using gbk) .这个时候就能够正确排序了。
如果使用HQL语句的话,由于hibernate不直接支持convert函数,所以我们需要手动给hibernate注册一个convert函数。注册也很简单,写一个类继承hibernate的方言类即可。
第一步:注册convert函数
---------------------------------------------------------------
package cn.com.ifc.ulib.utils;
import org.hibernate.Hibernate;
import org.hibernate.dialect.MySQL5InnoDBDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
/**
*
* @author wxj
*2012-10-11
*use:解决hql对mysql能够中文排序,即添加hql中convert函数.我们这里用的是mysql5
*/
public class MySQL5LocalDialect extends MySQL5InnoDBDialect {
public MySQL5LocalDialect() {
super();
registerFunction("convert", new SQLFunctionTemplate(Hibernate.STRING, "convert(?1 using ?2)")); //注册convert函数
}
}
--------------------------------------------------------------------------
第二步:在hibernate的配置文件或者spring的配置文件中注入自己写的具有convert函数的方言类
<props>
<prop key="hibernate.current_session_context_class">thread</prop>
<!--
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect //这个是之前的默认写法
</prop>
-->
<prop key="hibernate.dialect">
cn.com.ifc.ulib.utils.MySQL5LocalDialect //这是注册的我们自己的方言带有convet函数
</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
</props>
--------------------------------------------------------------------------
第三步:大功告成,可以使用啦
from user order by convert(username,'gbk');