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逻辑存在歧义,根据你的使用场景选择对应写法:
- 如果只需要返回关联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";
- 如果需要返回完整的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
相关产品推荐
相关产品推荐

