hibernate 中文排序

方法一、描写叙述:给Hibernate的MySQL方言包注冊一个排序方法,该方法中实现了MySQL中文排序。

代码:

import org.hibernate.dialect.MySQL5Dialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StringType;

public class MySQL5LocalDialect extends MySQL5Dialect {
	public MySQL5LocalDialect() {
		super();
		registerFunction("convert", new SQLFunctionTemplate(Hibernate.STRING,"convert(?1 using ?2)"));
		// Hibernate.STRING在Hibernate3.6.5.Final版本以下可以使用,因为在Hibernate4.0及以上的版本中,Hibernate.STRING已经不再使用了
		// 可以使用registerFunction("convert", new SQLFunctionTemplate(new StringType(), "convert(?1 using ?2)") ); 代替
	}
}

在applicationContext.xml中或hibernate.hbm.xml中修改 数据库配置的Dialect :

<property name="hibernate.dialect">MySQL5LocalDialect的包路径</property>

最后在HQL中使用convert方法, 例如:

 order by convert(name, 'gbk') , ("GBK"也可以是其他字符集),就ok啦!

该方法的弊端是须要改不同数据的方言包来实现不改代码的跨库。(须要改order by field 为 order by convert_gbk(field))。

方法二、描写叙述:单独改动Hibernate的MySQL方言包,改动order by方法,使该方法默认使用convert方法来实现中文排序。

代码:

import org.hibernate.NullPrecedence;
import org.hibernate.dialect.MySQLDialect;

public class MySQLGBKDialect extends MySQLDialect {

	public MySQLGBKDialect() {
	}

	public String renderOrderByElement(String expression, String collation, String order, NullPrecedence nulls) {
		expression = (new StringBuilder("convert(")).append(expression).append(" using 'gbk')").toString();
		return super.renderOrderByElement(expression, collation, order, nulls);
	}
}

renderOrderByElement该方法为复写父类中的方法,长处是不用改其它数据方言包,不用改代码,缺点是全部的排序方法将都运行convert方法。

方法三、描写叙述:首选查出该表的全部数据放入到list中,然后可以使用集合的辅助类collections.sort()进行排序。

代码:

public List<Object> sortByName(){

  List<Object>    ObjectList=dao.findAll();
            Collections.sort(ObjectList,new Comparator<Object>(){
                public int compare(Object o1, Object o2) {
                    String b1 = (String)o1.getName();  //获取实体的名称
                    String b2 = (String)o2.getName();
             
                    Collator cmp = Collator.getInstance(java.util.Locale.CHINA);    //中文首字母排序规则
                    if (cmp.compare(b1, b2)>0){    
                        return 1;    
                    }else if (cmp.compare(b1, b2)<0){    
                        return -1;    
                    }
                    return 0;
                }
            });
            
            return ObjectList;

}

以上是正序,倒序就把上面大于换成小于,小于换大于;或者-1 变1 ,1变-1 ;

另外如要实现点击 列表的表头实现正序和倒序,可以传递一个数字给服务器,每点击一次表头让这个数字自增1,后台可以根据这个数字奇偶性来进行正序和倒序。

 

参考

http://www.ithao123.cn/content-923375.html

http://www.cnblogs.com/sheldonC/p/5806755.html

http://blog.csdn.net/liu251890347/article/details/38864671

转载于:https://my.oschina.net/DemonCry/blog/784823

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值