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异步加载效果更好了。

简单显示如下:

积累一点多一点的哦。。。

猜你喜欢

转载自zl378837964.iteye.com/blog/1758745