mysql中文排序并实现仿手机通讯录
这里我对用户管理不想使用分页,就模仿手机通讯录实现。
简单的算法在测试的时候没问题,但是就是从数据库查询的数据显示不对,郁闷就调试呗。发现从数据库返回的数据不是按照字典排序的,为何不是以前的情况呢。想想发现,我为了不出现乱码,整个工程统一使用UTF-8编码的。
UTF8 默认校对集是 utf8_general_ci , 它不是按照中文来的。你需要强制让MySQL按中文来排序。出现这个问题的原因是因为MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象。
解决方法:
对于包含中文的字段加上"binary"属性,使之作为二进制比较,例如将"name char(10)"改成"name char(10)binary"。
如果你使用源码编译MySQL,可以编译MySQL时使用with charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了(默认的是latin1)。也可以用 extra-charsets=gb2312,gbk 来加入多个字符集。
如果不想对表结构进行修改或者重新编译MySQL(我的当然不会了,我就统一使用UTF8),也可以在查询语句的 order by 部分使用 CONVERT 函数。比如 select * from tablename order by CONVERT(chineseColumnName USING gbk);
因为CONVERT函数只适用于SQL不适用于HQL,
HQL语句没法使用,因为最终是要org.hibernate.hql.PARSER 解析成SQL语句的,解析的时候会报异常:
所以使用SQL,我又使用的是模板最终代码如下:
/**
* SQL设置 支持中文排序 CONVERT(chineseColumnName USING gbk)
* hibernateTemp.find("from OaUser order by convert("+prop+" using gbk)");
* 异常:org/hibernate/hql/ast/QuerySyntaxException.java
* org.hibernate.hql.PARSER - line 1:58: unexpected token: using
*/
使用回调函数灵活处理
@SuppressWarnings("unchecked") public List<OaUser> findAllByOrder(final String prop) { hibernateTemp.setCacheQueries(true); //设置二级缓存 return hibernateTemp.executeFind(new HibernateCallback<List<OaUser>>() { public List<OaUser> doInHibernate(Session session) throws HibernateException, SQLException { return session.createSQLQuery("select * from oa_user order by convert("+prop+" using gbk)") .addEntity(OaUser.class) .list(); } }); }
区分sql和hql语法我就不用说了吧。
1、.setCacheQueries(true);设置缓存减小数据库鸭梨啦。
2、addEntity(OaUser.class); 不设置语句不会报错,但是,在页面提取不到值;因为createQuery 和 createSQLQuery的不同,createSQLQuery得到的list里面不是entity对象。
对返回的list处理封装传到页面,然后再在页面处理迭代啦,
也可以使用Ajax异步加载效果更好了。
简单显示如下:
积累一点多一点的哦。。。
上一篇: 学习新技术的 10 个建议
下一篇: php xml 入门学习资料
推荐阅读