Hibernate 实现Oracle的中文汉字按照拼音排序

原始需求说明:

做的OA系统使用ssh+extjs,在给客户试用的时候,顾客觉得列表中中文汉字数据不是正常的按照拼音来排序的,客户就开始抱怨了,答应给客户修改,走起。


一开始以为是Extjs本身的Gird支持的问题,google一查,发现Grid也只支持ascii码排序,后来一想我的排序都是每次请求数据库的,排除了这个可能,那么问题就出现在在hibernate查询Oracle了,查看了我的通用查询排序接口,确实,使用的是criteria.addOrder(Order.desc(this.sortName));,Order.decs 到Oracle数据库中排序时,默认Oracle也是只支持ascii,这下完蛋了,于是乎google是否可以对Oracle参数进行设置,终于Google到了需要修改NLS_SORT系统参数,设置为SCHINESE_PINYIN_M,修改后觉得不太妥,如果客户又有新的方式,那就完蛋了啊。


想了20分钟,想了一个比较粗的方法,重写Order接口,代码如下

package com.sencloud.dh.core.command;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Order;

/**
 * 实现Oracle数据库中文字段按照拼音排序问题 <一句话功能简述> <功能详细描述>
 * 
 * @author xutianlong
 * @version [版本号, Mar 5, 2013]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class OracleOrder extends Order
{
    private String propertyName;

    private boolean ascending;

    protected OracleOrder(String propertyName, boolean ascending)
    {
        super(propertyName, ascending);
        this.propertyName = propertyName;
        this.ascending = ascending;
    }

    /**
     * 只考虑按一个字段排序的情况
     */
    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException
    {
        String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
        return " nlssort(" + columns[0] + ",'NLS_SORT=SCHINESE_PINYIN_M') " + (ascending ? "" : "desc");
    }

    public static OracleOrder getOrder(String propertyName, boolean ascending)
    {
        return new OracleOrder(propertyName, ascending);
    }

}


如何调用,在设置Criteria的Order 调用我自己的Order方法,

public Criteria execute(Criteria criteria)
    {
        String[] propertys = this.sortName.split("[.]");
        if ((propertys != null) && (propertys.length > 1))
        {
            for (int i = 0; i < propertys.length - 1; i++)
            {
                if (!this.filter.getAliasSet().contains(propertys[i]))
                {
                    criteria.createAlias(propertys[i], propertys[i]);
                    this.filter.getAliasSet().add(propertys[i]);
                }
            }
        }
        if ("desc".equalsIgnoreCase(this.ascDesc))
        {
            // criteria.addOrder(Order.desc(this.sortName));
            // 修改支持汉语拼音排序
            criteria.addOrder(OracleOrder.getOrder(this.sortName, false));
        }
        else if ("asc".equalsIgnoreCase(this.ascDesc))
        {
            // criteria.addOrder(Order.asc(this.sortName));
            // 修改支持汉语拼音排序
            criteria.addOrder(OracleOrder.getOrder(this.sortName, true));
        }
        return criteria;
    }



Ok,打完收工,解决这个问题了。


补充一点 Oracle9i之后才支持Oracle的中文汉字按照拼音排序

你可能感兴趣的:(Hibernate 实现Oracle的中文汉字按照拼音排序)