mysql 使用hql给汉字排序

Hibernate的HQL已经支持大多数数据库函数,肯定不能包括所有, 幸运的是Hibernate已经对此做了相应的方案解决, 也就是Dialect中注册数据库函数.具体做法如下,我们以Mysql5为例 

  Mysql 的convert函数,现现在数据库的字符集是utf-8,如果想实现中文排序,就需要用convert(filedName using gbk) 实现,但现有的hibernate的hql不能支持此函数, 我们可以现在Dialect注册一个函数,一样不赞成直接修改Hibernate 的源码, 我们可以扩展一个类,如下代码所示

import org.hibernate.Hibernate; 
import org.hibernate.dialect.MySQL5Dialect; 
import org.hibernate.dialect.function.SQLFunctionTemplate ; 


public class MySQL5LocalDialect extends MySQL5Dialect { 
public MySQL5LocalDialect(){
  super(); 
registerFunction("convert", new SQLFunctionTemplate(Hibernate.STRING, "convert(?1 using ?2)") );
  }
 }

 

现在applicationContext.xml中或hibernate.hbm.xml中修改 

package.MySQL5LocalDialect 
 
<property name="hibernate.dialect">
com.credit.publicmodel.util.MySQL5LocalDialect
</property>

  现在HQL中使用convert方法, 例如: order by convert(name, 'gbk') , "GBK"也可以是其他字符集
<think>我们正在讨论的是Hive查询语言(HQL)中如何实现分组后排序。根据用户提供的引用和之前的对话,用户已经了解开窗函数(如ROW_NUMBER, RANK, DENSE_RANK)的基本用法。现在,用户可能希望更全面地了解在Hive中实现分组排序的不同方法,包括使用开窗函数以及其他相关技术。 根据引用[1]和引用[3],Hive支持标准的SQL查询语法,包括GROUP BY和ORDER BY。但是,分组后排序通常有两种情况: 1. 对整个分组的结果进行排序(每个分组输出一个结果,然后对所有分组进行排序) 2. 在分组内对每个组内的记录进行排序(即开窗函数所做的事情) 用户的问题“分组后排序”可能同时包含这两种情况,但根据之前的对话,用户更关注的是分组内排序使用开窗函数)。不过,为了全面性,我们将涵盖两种主要场景。 场景一:对整个分组的结果进行排序 当我们使用GROUP BY进行分组聚合后,我们可能希望按照聚合后的结果进行排序。例如,统计每个部门的平均工资,然后按照平均工资从高到低排序。 场景二:在分组内对记录排序(分组内排序) 这通常使用开窗函数(窗口函数)来实现,例如在之前的回答中提到的ROW_NUMBER(), RANK(), DENSE_RANK()等。 下面分别进行说明: 一、对整个分组的结果进行排序 语法结构(参考引用[2]): SELECT [字段名或聚合函数] FROM 表名 [WHERE 非聚合条件] GROUP BY 分组字段名 [HAVING 聚合条件] ORDER BY 排序字段名 [asc | desc] 示例:统计每个部门的平均工资,并按平均工资降序排列 SELECT dept, AVG(salary) as avg_salary FROM employee GROUP BY dept ORDER BY avg_salary DESC; 二、在分组内对记录排序(分组内排序使用开窗函数,语法: SELECT ..., 开窗函数() OVER (PARTITION BY 分组字段 ORDER BY 排序字段 [asc|desc]) as 别名 FROM 表名 开窗函数可以是: - ROW_NUMBER(): 为每一行分配一个唯一的序号(不考虑并列) - RANK(): 相同的值排名相同,但会跳过后续名次(如:1,2,2,4) - DENSE_RANK(): 相同的值排名相同,且不会跳过后面的名次(如:1,2,2,3) 示例:在部门内对员工按工资降序排序,并给出排名 SELECT name, dept, salary, ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) as row_num, RANK() OVER (PARTITION BY dept ORDER BY salary DESC) as rank, DENSE_RANK() OVER (PARTITION BY dept ORDER BY salary DESC) as dense_rank FROM employee; 另外,引用[4]提到了LEFT SEMI JOIN,这虽然与分组排序不直接相关,但用户可能需要注意,在Hive中,LEFT SEMI JOIN可以用于代替IN或EXISTS子查询,并且它只返回左表中的字段。 总结:在Hive中实现分组后排序,根据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值