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后,会得到你期望的结果:
| Name | Popularity |
|---|---|
| John | 3 |
| Lisa | 2 |
| Mary | 1 |
| Jack | 1 |
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
相关产品推荐
相关产品推荐

