Score表score列平均值存入avg列问题排查(附JPA实体代码)
问题修复指南
实体字段映射问题
你实体类里的private double Score;首字母大写了,JPA默认会把字段映射成数据库的score列(小写),大小写不匹配会导致ORM映射出错,直接改成小写即可:
private double score; // 和数据库列名保持一致
NamedQuery完全写错了
你的NamedQuery从名字到逻辑全不符合需求:
- 名字叫
findByUserName,但你要实现的是计算平均值,改成Score.getTotalAverage才合理 - 查询语句里加了
where p.score = :avg,这是只筛选分数等于某个参数的行再求平均,而你要的是全表所有分数的总平均,根本不需要where条件 - 总平均计算不需要传参数,把
:avg去掉
修正后的NamedQuery:
@NamedQuery( name = "Score.getTotalAverage", query = "SELECT ROUND(AVG(p.score),2) FROM Score p" )
如何把总平均存入avg列
如果你是想一次性把表中所有行的avg列都更新为总平均值,需要新增一个更新用的查询:
新增更新用的NamedQuery
@NamedQuery( name = "Score.updateAllAvgToTotal", query = "UPDATE Score s SET s.avg = (SELECT ROUND(AVG(p.score),2) FROM Score p)" )
业务代码中调用更新
entityManager.createNamedQuery("Score.updateAllAvgToTotal").executeUpdate();
另外提一句:总平均属于衍生数据,其实没必要存在数据库里,每次需要时直接调用Score.getTotalAverage查询即可,避免后续分数变动时还要维护avg列,防止出现数据不一致的问题。
内容的提问来源于stack exchange,提问作者Mr.Kim
相关产品推荐
相关产品推荐

