Hibernateは、Oracleの中国語漢字をピンイン順に並べ替え、共通のクエリー並べ替え能力を実現します.

1903 ワード

以前、oracleがhibernateと組み合わせてピンインソートをサポートしていることを書いたことがあります.最適化してください.以前書いた小さなバグは、hibernateのOrderインタフェースを書き直した後、すべてのフィールドがピンインソートされていることです.
時間、数字のタイプの並べ替えがすべて乱れたことを招いて、1つの判断をプラスして、stringのタイプに対してピンインの並べ替えをしています
原文住所:http://blog.csdn.net/dracotianlong/article/details/8637561
修正したコードは以下の通りです.
package com.sencloud.dh.core.command;

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

/**
 *   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);
        Type propertyType= criteriaQuery.getTypeUsingProjection(criteria, propertyName);
//  string        
        if("string".equals(propertyType.getName()))
        {
        	  return " nlssort(" + columns[0] + ",'NLS_SORT=SCHINESE_PINYIN_M') " + (ascending ? "" : "desc");
        }
        else
        {
        	return super.toSqlString(criteria, criteriaQuery);
        }
     
      
    }

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

}