mysql 汉字 排序 hibernate_解决Hibernate中MySQL的中文排序

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

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

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

Sql代码

0818b9ca8b590ca3270a3433284dd417.png

SELECT *

FROM BZ_COMPANY

ORDER BY CONVERT( COMPANY_NAME USING GBK ) ASC

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

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

hibernate的Order:

Java代码

0818b9ca8b590ca3270a3433284dd417.png

//$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 Criteria 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

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

}

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代码

0818b9ca8b590ca3270a3433284dd417.png

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 

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 

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);

}

}

使用例子:

Java代码

0818b9ca8b590ca3270a3433284dd417.png

public PageControl findPage(final PageControl pageControl, final Object bean) {

try {

final Class clazz = bean.getClass();

List data = (List) this.getHibernateTemplate().execute(new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException, SQLException {

Criteria criteria = session.createCriteria(clazz);

criteria.add(Example.create(bean)

.ignoreCase()

.enableLike(MatchMode.ANYWHERE));

if (pageControl != null) {

int start = pageControl.getStart();

int limit = pageControl.getLimit();

criteria.setFirstResult(start);

criteria.setMaxResults(limit);

String sort = pageControl.getSort();

String dir = pageControl.getDir();

if (sort != null && dir != null) {

criteria.addOrder(dir.equalsIgnoreCase("ASC") ? GBKOrder.asc(sort) : GBKOrder.desc(sort));

}

}

return criteria.list();

}

});

Long totalCount = getTotalCount(bean);

PageControl rt = new PageControl();

rt.setData(data);

rt.setTotalCount(totalCount);

return rt;

} catch (RuntimeException e) {

log.error("find page failed", e);

throw e;

}

}

当然,你有需要的话,不必写死GBK

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
配置 Hibernate 的环境需要以下步骤: 1. 下载 Hibernate 的最新版本,并将其解压到本地文件夹。 2. 在项目添加 Hibernate 的 jar 包,包括 Hibernate 的核心包和依赖包。 3. 配置 Hibernate 的配置文件,命名为 hibernate.cfg.xml,并将其放在类路径下。 4. 在配置文件配置数据库连接信息,包括数据库驱动、数据库连接 URL、用户名和密码等。 5. 配置 Hibernate 的映射文件,即将 Java 对象与数据库表进行映射。映射文件的命名为 *.hbm.xml。 6. 在代码使用 Hibernate API 进行数据库的操作,包括增删改查等。 下面是一个简单的示例: 1. 下载 Hibernate 最新版本,并解压到本地文件夹 C:\hibernate。 2. 创建 Java 项目,并在项目添加 Hibernate 的 jar 包。 3. 在项目的 src 目录下创建 hibernate.cfg.xml 文件,并配置数据库连接信息: ```xml <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> </session-factory> </hibernate-configuration> ``` 4. 在项目的 src 目录下创建 User.hbm.xml 文件,并配置用户表的映射信息: ```xml <hibernate-mapping> <class name="com.example.User" table="user"> <id name="id" type="int"> <generator class="native"/> </id> <property name="name" type="string"/> <property name="age" type="int"/> </class> </hibernate-mapping> ``` 5. 在代码使用 Hibernate API 进行数据库操作: ```java Configuration cfg = new Configuration().configure(); SessionFactory sf = cfg.buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); User user = new User(); user.setName("Tom"); user.setAge(20); session.save(user); tx.commit(); session.close(); sf.close(); ``` 以上就是配置 Hibernate 的基本步骤。需要注意的是,Hibernate 的配置和使用方法还有很多细节,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值