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

Hibernate查询Ratings实体提示无法解析userId属性如何修复

Ratings实体关联字段JPQL查询报属性不存在错误修复

问题现象

查询Ratings实体对象时抛出Hibernate解析异常,错误信息如下:

Caused by: org.hibernate.QueryException: could not resolve property: userId of: com.smartedulanka.finalyearproject.datalayer.entity.Ratings

相关代码如下:
Repository层查询方法:

@Query("SELECT r FROM Ratings r WHERE r.userId = ?1 AND r.answer_id = ?2")
public Ratings searchObject(Long userId,Long answerId);

Ratings实体类定义:

public class Ratings {
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "userId")
    private User user;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "answer_id")
    private Answer answer;
    // 省略get、set方法
}

错误根因

JPQL是面向实体对象的查询语言,查询时匹配的是Java实体类中定义的属性名,不是数据库表的字段名。
Ratings实体中只定义了user、answer两个对象类型的关联属性,不存在userId、answer_id这两个属性,因此Hibernate解析查询语句时找不到对应属性抛出异常。
注意:@JoinColumn注解的name参数配置的是数据库中外键列的实际列名,仅用于做ORM映射,不代表实体类存在同名属性。

修复方法

方法1:修改JPQL语句匹配实体属性路径

通过关联对象的主键属性做条件匹配,这是JPA查询的标准写法:

@Query("SELECT r FROM Ratings r WHERE r.user.id = ?1 AND r.answer.id = ?2")
public Ratings searchObject(Long userId, Long answerId);

语句中r.user.id表示取Ratings关联的User对象的主键值,会自动映射到数据库的userId外键列;r.answer.id同理映射到answer_id外键列。

方法2:改用原生SQL查询

如果不想使用JPQL的属性路径写法,可以直接写原生SQL匹配数据库列名,需要在注解中开启原生查询标识:

@Query(value = "SELECT * FROM ratings WHERE userId = ?1 AND answer_id = ?2", nativeQuery = true)
public Ratings searchObject(Long userId, Long answerId);

注意使用原生SQL时,表名、列名必须和数据库中的实际命名完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:48:32