欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JPQL实现中文排序

程序员文章站 2022-04-13 15:59:29
...

直接使用JPQL中order by对中文进行排序,出来的结果并不是按拼音排序。

想实现中文排序,需要使用到hibernate.dialect。思路为:手动定义一个sql function,供JPQL使用,实现中文排序,这个function是基于特定的数据库的。

步骤如下:

1. 实现sql function

package com.wgitech.core;

import org.hibernate.dialect.Oracle10gDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StandardBasicTypes;

/**
 * 数据库为ORACLE
 * @author amCharlie
 */
public class OracleChineseDialect extends Oracle10gDialect{
	
	/**
	 * 使JPQL支持中文排序
	 */
	public OracleChineseDialect(){
		super();
		registerFunction("convert_gbk", new SQLFunctionTemplate(StandardBasicTypes.STRING, "nlssort(?1,'NLS_SORT=SCHINESE_PINYIN_M')"));
	}
}

以上是基于oracle数据库的代码,如果是其他数据库,1. 修改继承的类Oracle10gDialect,2. 找到该数据库中文排序的方法。

如以下是基于MySql的代码:

package com.tbd.core;

import org.hibernate.dialect.MySQL57InnoDBDialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StringType;
 
public class MySQLChineseDialect extends MySQL57InnoDBDialect {
 
    public MySQLLocalDialect(){
        super();
        registerFunction("convert",new SQLFunctionTemplate(StringType.INSTANCE, "convert(?1 using ?2)") );
    }
}

查看不同版本数据库对应的方言类请查阅:https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/dialect/package-summary.html(其中ORACLE 10G,ORACLE 11G均用Oracle10gDialect)

 

2. 配置hibernate.dialect

这是hibernate的一个property,可以按如下配置:

<property name="dialect">com.tbd.core.OracleChineseDialect</property>

3. 使用新建的sql function

使用registerFunction注册的函数,第一个参数即为新方法名,jpql中可以直接使用该方法。举例如下:

String querySql = "select p from Person p order by convert_gbk(p.name)";
List<Person> personList = em.createQuery(querySql, Person.class).getResultList();