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
相关产品推荐
相关产品推荐

