欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql中文排序并实现仿手机通讯录

程序员文章站 2022-06-17 13:51:24
...


         这里我对用户管理不想使用分页,就模仿手机通讯录实现。

 

 

 

          简单的算法在测试的时候没问题,但是就是从数据库查询的数据显示不对,郁闷就调试呗。发现从数据库返回的数据不是按照字典排序的,为何不是以前的情况呢。想想发现,我为了不出现乱码,整个工程统一使用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异步加载效果更好了。

简单显示如下:

 

mysql中文排序并实现仿手机通讯录
            
    
    博客分类: j2ee  

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

 

 

  • mysql中文排序并实现仿手机通讯录
            
    
    博客分类: j2ee  
  • 大小: 12.5 KB