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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:35:23