`
Aubergine_kang
  • 浏览: 264761 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate中的createCretia实现中文排序(转)

 
阅读更多

最近使用mysql做一个交易网站,使用hibernate作为持久化框架。

当我使用hibernate的Order进行排序的时候,杯具发生了。中文给我乱排了。

mysql中如果需要正常按照中文排序,其中一种处理方法是

 

Sql代码 复制代码 收藏代码
  1. SELECT *   
  2. FROM BZ_COMPANY   
  3. ORDER BY CONVERT( COMPANY_NAME USING GBK ) ASC  
SELECT *
FROM BZ_COMPANY
ORDER BY CONVERT( COMPANY_NAME USING GBK ) ASC

 

 

可问题是这样就脱离hibernate了。本打算使用QBC做一些公共的方法的。

然后就去看了下hibernate中Order的实现。

 

hibernate的Order:

 

Java代码 复制代码 收藏代码
  1. //$Id: Order.java,v 1.1 2011/05/29 18:11:15 Surui Exp $   
  2. package org.hibernate.criterion;   
  3.   
  4. import java.io.Serializable;   
  5. import java.sql.Types;   
  6.   
  7. import org.hibernate.Criteria;   
  8. import org.hibernate.HibernateException;   
  9. import org.hibernate.engine.SessionFactoryImplementor;   
  10. import org.hibernate.type.Type;   
  11.   
  12. /**  
  13.  * Represents an order imposed upon a <tt>Criteria</tt> result set  
  14.  * @author Gavin King  
  15.  */  
  16. public class Order implements Serializable {   
  17.   
  18.     private boolean ascending;   
  19.     private boolean ignoreCase;   
  20.     private String propertyName;   
  21.        
  22.     public String toString() {   
  23.         return propertyName + ' ' + (ascending?"asc":"desc");   
  24.     }   
  25.        
  26.     public Order ignoreCase() {   
  27.         ignoreCase = true;   
  28.         return this;   
  29.     }   
  30.   
  31.     /**  
  32.      * Constructor for Order.  
  33.      */  
  34.     protected Order(String propertyName, boolean ascending) {   
  35.         this.propertyName = propertyName;   
  36.         this.ascending = ascending;   
  37.     }   
  38.   
  39.     /**  
  40.      * Render the SQL fragment  
  41.      *  
  42.      */  
  43.     public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)    
  44.     throws HibernateException {   
  45.         String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);   
  46.         Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName);   
  47.         StringBuffer fragment = new StringBuffer();   
  48.         for ( int i=0; i<columns.length; i++ ) {   
  49.             SessionFactoryImplementor factory = criteriaQuery.getFactory();   
  50.             boolean lower = ignoreCase && type.sqlTypes( factory )[i]==Types.VARCHAR;   
  51.             if (lower) {   
  52.                 fragment.append( factory.getDialect().getLowercaseFunction() )   
  53.                     .append('(');   
  54.             }   
  55.             fragment.append( columns[i] );   
  56.             if (lower) fragment.append(')');   
  57.             fragment.append( ascending ? " asc" : " desc" );   
  58.             if ( i<columns.length-1 ) fragment.append(", ");   
  59.         }   
  60.         return fragment.toString();   
  61.     }   
  62.   
  63.     /**  
  64.      * Ascending order  
  65.      *  
  66.      * @param propertyName  
  67.      * @return Order  
  68.      */  
  69.     public static Order asc(String propertyName) {   
  70.         return new Order(propertyName, true);   
  71.     }   
  72.   
  73.     /**  
  74.      * Descending order  
  75.      *  
  76.      * @param propertyName  
  77.      * @return Order  
  78.      */  
  79.     public static Order desc(String propertyName) {   
  80.         return new Order(propertyName, false);   
  81.     }   
  82.   
  83. }  
//$Id: Order.java,v 1.1 2011/05/29 18:11:15 Surui Exp $
package org.hibernate.criterion;

import java.io.Serializable;
import java.sql.Types;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.type.Type;

/**
 * Represents an order imposed upon a <tt>Criteria</tt> result set
 * @author Gavin King
 */
public class Order implements Serializable {

	private boolean ascending;
	private boolean ignoreCase;
	private String propertyName;
	
	public String toString() {
		return propertyName + ' ' + (ascending?"asc":"desc");
	}
	
	public Order ignoreCase() {
		ignoreCase = true;
		return this;
	}

	/**
	 * Constructor for Order.
	 */
	protected Order(String propertyName, boolean ascending) {
		this.propertyName = propertyName;
		this.ascending = ascending;
	}

	/**
	 * Render the SQL fragment
	 *
	 */
	public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) 
	throws HibernateException {
		String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
		Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName);
		StringBuffer fragment = new StringBuffer();
		for ( int i=0; i<columns.length; i++ ) {
			SessionFactoryImplementor factory = criteriaQuery.getFactory();
			boolean lower = ignoreCase && type.sqlTypes( factory )[i]==Types.VARCHAR;
			if (lower) {
				fragment.append( factory.getDialect().getLowercaseFunction() )
					.append('(');
			}
			fragment.append( columns[i] );
			if (lower) fragment.append(')');
			fragment.append( ascending ? " asc" : " desc" );
			if ( i<columns.length-1 ) fragment.append(", ");
		}
		return fragment.toString();
	}

	/**
	 * Ascending order
	 *
	 * @param propertyName
	 * @return Order
	 */
	public static Order asc(String propertyName) {
		return new Order(propertyName, true);
	}

	/**
	 * Descending order
	 *
	 * @param propertyName
	 * @return Order
	 */
	public static Order desc(String propertyName) {
		return new Order(propertyName, false);
	}

}

 

 

重点就在toSqlString上了,QBC的Criteria也是toSqlString产生对应sql的,所以只要在这里做手脚,就能达到效果。

当然,不赞成直接改源码。

 

然后就有了GBKOrder:

 

Java代码 复制代码 收藏代码
  1. package comm;   
  2.   
  3. import java.sql.Types;   
  4.   
  5. import org.hibernate.Criteria;   
  6. import org.hibernate.HibernateException;   
  7. import org.hibernate.criterion.CriteriaQuery;   
  8. import org.hibernate.criterion.Order;   
  9. import org.hibernate.engine.SessionFactoryImplementor;   
  10. import org.hibernate.type.Type;   
  11.   
  12. public class GBKOrder extends Order {   
  13.     private String encoding = "GBK";   
  14.     private boolean ascending;   
  15.     private boolean ignoreCase;   
  16.     private String propertyName;   
  17.   
  18.     @Override  
  19.     public String toString() {   
  20.         return "CONVERT( " + propertyName + " USING " + encoding + " ) " + (ascending ? "asc" : "desc");   
  21.     }   
  22.   
  23.     @Override  
  24.     public Order ignoreCase() {   
  25.         ignoreCase = true;   
  26.         return this;   
  27.     }   
  28.   
  29.     /**  
  30.      * Constructor for Order.  
  31.      */  
  32.     protected GBKOrder(String propertyName, boolean ascending) {   
  33.         super(propertyName, ascending);   
  34.         this.propertyName = propertyName;   
  35.         this.ascending = ascending;   
  36.     }   
  37.   
  38.     /**  
  39.      * Constructor for Order.  
  40.      */  
  41.     protected GBKOrder(String propertyName, String dir) {   
  42.         super(propertyName, dir.equalsIgnoreCase("ASC") ? true : false);   
  43.         ascending = dir.equalsIgnoreCase("ASC") ? true : false;   
  44.         this.propertyName = propertyName;   
  45.         this.ascending = ascending;   
  46.     }   
  47.   
  48.     /**  
  49.      * Render the SQL fragment  
  50.      *   
  51.      */  
  52.     @Override  
  53.     public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {   
  54.         String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);   
  55.         Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName);   
  56.         StringBuffer fragment = new StringBuffer();   
  57.         for (int i = 0; i < columns.length; i++) {   
  58.             SessionFactoryImplementor factory = criteriaQuery.getFactory();   
  59.             boolean lower = ignoreCase && type.sqlTypes(factory)[i] == Types.VARCHAR;   
  60.             if (lower) {   
  61.                 fragment.append(factory.getDialect().getLowercaseFunction()).append('(');   
  62.             }   
  63.             fragment.append("CONVERT( " + columns[i] + " USING " + encoding + " )");   
  64.             if (lower)   
  65.                 fragment.append(')');   
  66.             fragment.append(ascending ? " asc" : " desc");   
  67.             if (i < columns.length - 1)   
  68.                 fragment.append(", ");   
  69.         }   
  70.         return fragment.toString();   
  71.     }   
  72.   
  73.     /**  
  74.      * Ascending order  
  75.      *   
  76.      * @param propertyName  
  77.      * @return Order  
  78.      */  
  79.     public static Order asc(String propertyName) {   
  80.         return new GBKOrder(propertyName, true);   
  81.     }   
  82.   
  83.     /**  
  84.      * Descending order  
  85.      *   
  86.      * @param propertyName  
  87.      * @return Order  
  88.      */  
  89.     public static Order desc(String propertyName) {   
  90.         return new GBKOrder(propertyName, false);   
  91.     }   
  92. }  
package comm;

import java.sql.Types;

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

public class GBKOrder extends Order {
	private String encoding = "GBK";
	private boolean ascending;
	private boolean ignoreCase;
	private String propertyName;

	@Override
	public String toString() {
		return "CONVERT( " + propertyName + " USING " + encoding + " ) " + (ascending ? "asc" : "desc");
	}

	@Override
	public Order ignoreCase() {
		ignoreCase = true;
		return this;
	}

	/**
	 * Constructor for Order.
	 */
	protected GBKOrder(String propertyName, boolean ascending) {
		super(propertyName, ascending);
		this.propertyName = propertyName;
		this.ascending = ascending;
	}

	/**
	 * Constructor for Order.
	 */
	protected GBKOrder(String propertyName, String dir) {
		super(propertyName, dir.equalsIgnoreCase("ASC") ? true : false);
		ascending = dir.equalsIgnoreCase("ASC") ? true : false;
		this.propertyName = propertyName;
		this.ascending = ascending;
	}

	/**
	 * Render the SQL fragment
	 * 
	 */
	@Override
	public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
		String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
		Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName);
		StringBuffer fragment = new StringBuffer();
		for (int i = 0; i < columns.length; i++) {
			SessionFactoryImplementor factory = criteriaQuery.getFactory();
			boolean lower = ignoreCase && type.sqlTypes(factory)[i] == Types.VARCHAR;
			if (lower) {
				fragment.append(factory.getDialect().getLowercaseFunction()).append('(');
			}
			fragment.append("CONVERT( " + columns[i] + " USING " + encoding + " )");
			if (lower)
				fragment.append(')');
			fragment.append(ascending ? " asc" : " desc");
			if (i < columns.length - 1)
				fragment.append(", ");
		}
		return fragment.toString();
	}

	/**
	 * Ascending order
	 * 
	 * @param propertyName
	 * @return Order
	 */
	public static Order asc(String propertyName) {
		return new GBKOrder(propertyName, true);
	}

	/**
	 * Descending order
	 * 
	 * @param propertyName
	 * @return Order
	 */
	public static Order desc(String propertyName) {
		return new GBKOrder(propertyName, false);
	}
}

 

 

 

分享到:
评论

相关推荐

    解决Hibernate中MySQL的中文排序

    在这个例子中,`@OrderBy`注解使得Hibernate在查询`Article`时,根据`title`字段的GBK中文排序规则进行排序。 另外,提供的`GBKOrder.java`文件可能是实现自定义排序策略的类。在Hibernate中,可以通过实现`...

    Hibernate中对表某个字段排序

    Hibernate中对表某个字段排序,直接在配置里面实现排序功能。

    论坛系统项目(Struts 2+Hibernate+Spring实现)

    论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...

    hibernate中文参考手册

    《Hibernate中文参考手册》是Java开发领域中关于Hibernate框架的重要学习资源,主要涵盖了Hibernate的中文API及详尽的参考信息。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它极大地简化了Java应用程序对...

    基于Struts 2和Hibernate的Blog实现

    **基于Struts 2和Hibernate的Blog实现** 在IT领域,构建一个博客系统是常见的实践项目,用于学习和展示Web开发技术。本项目利用Struts 2和Hibernate这两个流行的Java框架,实现了一个基本的博客系统。Struts 2是MVC...

    hibernate中文参考文档

    标题“hibernate中文参考文档”意味着该文档是一份面向中文用户的Hibernate框架的参考资料,旨在为开发者提供详细的技术指导和用法说明。从描述来看,这份文档内容涵盖了Hibernate框架的主要特性和用法,从基础的...

    Spring+Hibernate实现用户登录

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别专注于应用的依赖管理和持久层操作。本项目"Spring+Hibernate实现用户登录"旨在演示如何整合这两个框架,构建一个能够处理用户登录功能的Web应用程序。...

    Hibernate 中文api 等学习资料

    2. **HIBERNATE - Relational Persistence for Idiomatic Java.pdf**:这本书可能详细介绍了Hibernate如何实现Java中的关系数据持久化,可能会包含最佳实践和示例代码。 3. **Hibernate 中文API文档.chm**:这是...

    hibernate注册功能的实现

    在IT行业中,Web开发是关键领域之一,而Struts和Hibernate是两个非常重要的框架,用于构建动态、数据驱动的Web应用程序。在这个实例中,我们将深入探讨如何利用这两个框架实现用户注册功能,即向数据库中插入一条新...

    Hibernate中文Api最新参考文档

    总之,Hibernate中文API最新参考文档将帮助开发者掌握如何利用Hibernate的各类功能,实现高效、灵活的数据库操作,提升Java应用程序的开发效率和质量。通过深入学习和实践,开发者可以熟练地运用Hibernate解决实际...

    hibernate中文参考文档pdf

    《Hibernate中文参考文档》是Java开发领域中关于Hibernate框架的重要学习资源,主要涵盖了Hibernate 3.6.10版本的相关内容。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在Java应用程序...

    网络硬盘(Struts 2+Hibernate+Spring实现)

    网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring...

    Hibernate实现原理模拟

    本教程将通过模拟Hibernate的实现原理,帮助开发者深入理解其工作方式,以便更好地运用到实际项目中。 **一、Hibernate概述** Hibernate是一个开源的ORM框架,它提供了一种在Java应用中持久化对象到关系数据库的...

    Hibernate Criteria 排序的問題

    对于简单的查询场景,使用HQL(Hibernate Query Language)即可轻松实现排序功能;但对于复杂的多表关联查询场景,则需要借助Criteria API来灵活构建查询条件。本文将围绕给定的代码片段,深入探讨Hibernate ...

    struts2+hibernate+mysql实现注册登录

    在这个项目中,“struts2+hibernate+mysql实现注册登录”是一个基础的实战教程,旨在帮助新手理解如何在实际应用中整合这三个技术。 **Struts2** 是一个强大的MVC框架,它负责处理HTTP请求,控制应用程序的流程,并...

    JSP+Hibernate实现留言板

    在这个案例中,我们使用了Java服务器页面(JSP)作为视图层,Hibernate作为持久层框架来处理数据库操作,实现了留言板的功能。下面我们将深入探讨这两个技术及其在留言板应用中的具体应用。 **1. JSP(Java Server ...

    hibernate中文文档 HTML格式

    在“Hibernate中文文档 HTML格式”中,这些概念和使用方法都将以易于理解的方式呈现,适合初学者和有经验的开发者参考学习。通过阅读这份文档,你将能够深入理解Hibernate的工作原理,并学会如何在实际项目中有效...

    hibernate 3.2中文手册 中文文档

    ### Hibernate 3.2中文手册知识点汇总 #### 第1章:Hibernate入门 - **1.1 前言** - 介绍了Hibernate的基本概念及其重要性。 - 强调了学习Hibernate对于Java开发人员的重要性。 - **1.2 第一部分—第一个...

    hibernate 3.6 中文 chm

    《Hibernate 3.6 中文 CHM》是一个针对...以上只是《Hibernate 3.6 中文 CHM》文档中部分关键知识点的概述。通过深入学习和实践,开发者可以充分利用Hibernate的强大功能,提高开发效率,降低数据库操作的复杂性。

    hibernate criteria 分组 排序 关联

    在Hibernate中,使用`Criteria`进行查询时,可以通过添加排序条件来对结果集进行排序。`Criteria`提供了一个非常灵活的方式来实现这一点。 **示例代码**: ```java Criteria criteria = session.createCriteria...

Global site tag (gtag.js) - Google Analytics