mysql 通讯录的实现_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 findAllByOrder(final String prop) {

hibernateTemp.setCacheQueries(true); //设置二级缓存

return hibernateTemp.executeFind(new HibernateCallback>() {

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

简单显示如下:

21d00c744d8cdaa0ddf76f22c77fc9cc.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值