You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+Hibernate实现姓名热度统计排序的SQL编写求助

统计姓名热度并排序的SQL实现(Spring Boot + Hibernate)

正确的SQL语句

你之前的SQL嵌套子查询是多余的,直接通过分组统计就能实现需求:

SELECT 
    Name,
    COUNT(*) AS Popularity
FROM Family
GROUP BY Name
ORDER BY Popularity DESC, Name ASC;
  • GROUP BY Name:将相同姓名的记录归为一组
  • COUNT(*):统计每组的记录数量,即姓名的热度值
  • ORDER BY Popularity DESC:按热度降序排序,热度相同的情况下按姓名升序排列(可选,保证结果排序稳定)

执行上述SQL后,会得到你期望的结果:

NamePopularity
John3
Lisa2
Mary1
Jack1

Spring Boot + Hibernate @Query实现

1. 实体类定义

假设你的Family实体类映射数据表:

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Entity
@Table(name = "Family")
public class Family {
    @Id
    private Long id;
    private String name;
    private String surname;

    // 省略Getter、Setter、构造方法
}

2. 结果DTO(可选,推荐)

创建DTO类用于接收统计结果,避免直接返回Object数组:

public class NamePopularityDTO {
    private String name;
    private Long popularity;

    public NamePopularityDTO(String name, Long popularity) {
        this.name = name;
        this.popularity = popularity;
    }

    // 省略Getter方法
}

3. Repository接口中的@Query

在Repository接口中编写JPQL查询:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.List;

public interface FamilyRepository extends CrudRepository<Family, Long> {

    @Query("SELECT new com.yourpackage.NamePopularityDTO(f.name, COUNT(f)) " +
           "FROM Family f " +
           "GROUP BY f.name " +
           "ORDER BY COUNT(f) DESC, f.name ASC")
    List<NamePopularityDTO> getNamePopularity();
}
  • 如果不需要DTO,也可以返回List<Object[]>,数组第一个元素为String类型的姓名,第二个为Long类型的热度值。

内容的提问来源于stack exchange,提问作者meursault

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:15:35