Spring Data JPA中如何按枚举值统计数据行数?
问题解决方案
问题根源
你的Repository方法getErrorCount()犯了基础的类型匹配错误:
- 原生SQL执行
select count(*)返回的是数值类型(BigInteger),用于统计符合条件的行数 - 但你把方法返回类型定义成了枚举
ErrorLogEntryPriorityType,JPA尝试把查询得到的BigInteger强制转成枚举,直接触发ClassCastException
修正方案
方案1:修正原生SQL方法的返回类型
把方法返回类型改成long(推荐,统计行数基本不会超出long的范围)或者BigInteger,和查询结果的类型匹配:
public interface ErrorLogEntryRepository extends JpaRepository<ErrorLogEntryEntity, UUID> { List<ErrorLogEntryEntity> findByChangedUserId(UUID userId); @Query(nativeQuery = true, value = "select count(*) from error_log_entry where priority = 'DANGER'") long getErrorCount(); // 这里改成long类型 }
方案2:用Spring Data JPA派生查询(更简洁安全)
完全不用写原生SQL,利用Spring Data的方法命名规则自动生成查询,还能避免手动写SQL可能出现的枚举字符串拼写错误:
public interface ErrorLogEntryRepository extends JpaRepository<ErrorLogEntryEntity, UUID> { List<ErrorLogEntryEntity> findByChangedUserId(UUID userId); // 直接通过方法名定义统计查询,Spring会自动处理枚举与数据库字符串的映射 long countByPriority(ErrorLogEntryPriorityType priority); }
调用时只需传入枚举值即可得到统计结果:
long dangerCount = errorLogEntryRepository.countByPriority(ErrorLogEntryPriorityType.DANGER);
额外提示
- 当使用
@Enumerated(EnumType.STRING)时,JPA会自动把枚举值转成对应的字符串存入数据库,查询时也会自动把数据库字符串转回枚举,所以用派生查询完全不用手动处理字符串匹配 - 尽量优先使用派生查询,减少原生SQL的编写,降低出错概率,也更符合Spring Data JPA的设计理念
内容的提问来源于stack exchange,提问作者Maflec
相关产品推荐
相关产品推荐

