• HQL中的中文排序

    普通类
    • 支持
    • 批判
    • 提问
    • 解释
    • 补充
    • 删除
    • 直接用order by 中文字段

    Sql语句:

    SELECT * FROM table_name WHERE   条件ORDER BY    中文utf-8字段

    HQL语句:

    FROM类WHERE 条件ORDER BY   中文utf-8字段

    因为项目使用GBK编码,所以中文排序出现问题。

    • 使用convert函数

    网上查了一下,可以用CONVERT函数转化成GBK排序。

    Sql语句:

    SELECT * FROM         table_name WHERE   条件ORDER BY  CONVERT(中文utf-8字段USING GBK)

     在数据库工具中使用,排序正常,问题解决。

    HQL中报错

    但用到HQL上,却报错,

    严重: Servlet.service() for servlet action threw exceptionline 1:172: unexpected token: using

    ……

    HQL报错原因分析

     原来是hibernate不支持convert方法

    网上查询,需要注册一个转换方法。

    参考:http://blog.sina.com.cn/s/blog_624a352c0100qkaq.html

    http://www.oschina.net/bbs/thread/302

    因为项目使用C3P0连接池,无法原封不动套用,而且版本也不太一样。

    • 解决方案
    1. 先扩展MYSQL的方言类

    package etc.dao;

     

    import org.hibernate.Hibernate;

    import org.hibernate.dialect.MySQLDialect;

    import org.hibernate.dialect.function.SQLFunctionTemplate;

    /**

    * 为在HQL中使用中文排序,注册添加函数类

    */

    public class MySQL5LocalDialect extends MySQLDialect {

    public MySQL5LocalDialect() {

    super();

    // registerFunction("convert", new SQLFunctionTemplate(Hibernate.STRING, "convert(?1 using ?2)"));

    // 使用上面一种注册方法后仍报错,所以换下面一种,缺点不灵活,写死转换gbk

    registerFunction("convert_gbk", new SQLFunctionTemplate(Hibernate.STRING, "convert(?1 using gbk)"));

    }

    }

    2、修改hibernate的配置文件

    #hep.db.hibernate.dialect=org.hibernate.dialect.MySQLDialect#更改前

    hep.db.hibernate.dialect=etc.dao.MySQL5LocalDialect #更改后

    • 使用方法

    需要对中文排序的地方直接使用:order by convert_gbk(中文字段)

    可参考etc.service.community. CommunityUploadResService.java的方法:getUploadResByUser()

    • 标签:
    • 方法
    • 排序
    • gbk
    • hql
    • 中文
    • 使用
    • import
    • 报错
    • 注册
    • convert
  • 加入的知识群:
    学习元评论 (0条)

    评论为空
    聪明如你,不妨在这 发表你的看法与心得 ~



    登录之后可以发表学习元评论。
      
暂无内容~~
顶部