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

Hibernate执行executeQuery原生查询时报queue_id字段不存在错误求助

错误根因

  • 注解误用:Stats类中对@ManyToOne关联的Queue字段,错误使用了@javax.persistence.Column注解指定外键列名。@Column注解仅对普通实体字段生效,关联字段的外键列必须使用@JoinColumn注解配置才会被Hibernate识别。
  • 默认外键名规则触发:由于注解配置不生效,Hibernate会按照默认规则生成@ManyToOne关联的外键列名:关联属性名 + _id,也就是你报错里的queue_id。你实际数据库中Stats表的外键列是skill_group_id,和Hibernate生成的默认列名不匹配,就会报字段不存在的错误。
  • 你去掉queue as id后查询仅返回普通聚合字段,不需要映射Queue关联对象,不会触发Hibernate自动拼接外键列的逻辑,因此运行正常。

解决方案

第一步:修正关联字段注解

将Stats类中Queue字段的注解替换为@JoinColumn,明确指定外键列名:

@ManyToOne
@JoinColumn(name = "skill_group_id") // 替换原来的@Column注解
Queue queue;

第二步:调整查询语句逻辑

你当前写的queue as id逻辑存在歧义,根据你的使用场景选择对应写法:

  1. 如果只需要返回关联Queue的id值,直接查询外键列即可(无需映射关联对象):
String query = "select SUM(serviceCallsAbandoned) as serviceCallsAbandoned, SUM(serviceCallsOffered) as serviceCallsOffered, SUM(serviceLevelCalls) as serviceLevelCalls, SUM(callsDequed) as routerCallsDequeued, skill_group_id as id from Stats";
  1. 如果需要返回完整的Queue实体对象,建议优先使用JPQL查询,避免原生SQL的实体映射问题:
// 返回聚合值+Queue实体
String jpql = "select SUM(s.serviceCallsAbandoned), SUM(s.serviceCallsOffered), SUM(s.serviceLevelCalls), SUM(s.callsDequed), s.queue from Stats s group by s.queue";
List result = Stats.executeQuery(jpql);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:03