Spring Boot 2升级后NamedNativeQuery触发PropertyReferenceException求助
解决Spring Boot 2.1升级后Spring Data JPA的PropertyReferenceException问题
咱们直接来拆解你遇到的问题和对应的解决方案:
问题根源
Spring Boot从1.5.x升级到2.1.x后,Spring Data JPA的方法解析逻辑变得更严格了。在1.5.x版本中,只要存在匹配名称的命名查询,框架会优先使用它而跳过方法名的属性解析;但2.1.x版本里,如果Repository方法没有显式标注@Query注解,框架会默认尝试通过方法名语义去匹配实体类的属性。
你的Repository方法名为getPayments,框架会自动试图在DailyPaymentOrgFunc实体中寻找对应的payments属性(或者getPayments() getter方法),但你的实体类里根本没有这个属性,所以直接抛出了PropertyReferenceException。
解决方案
只需要给Repository的方法添加@Query注解,明确指定要使用的命名查询名称,就能让框架跳过方法名的属性解析,直接调用你定义的存储过程查询:
修改后的Repository代码:
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface DailyPaymentOrgRepository extends JpaRepository<DailyPaymentOrgFunc,String> { @Query(name = Function.ORG_FUNC_NAME) // 新增这一行,绑定命名查询 List<DailyPaymentOrgFunc> getPayments(@Param("orgCode") Integer orgCode); }
额外验证点
- 确认你的命名查询名称
DailyPaymentOrgFunc.getPayments格式正确:命名查询的标准格式就是实体类名.方法名,和你Repository的方法名完全匹配,加上注解后能正确关联。 - 检查存储过程的参数绑定:你的命名查询里用了
:orgCode参数,Repository方法也对应标注了@Param("orgCode"),这部分逻辑是没问题的。
这样修改后,Spring Data JPA就会直接执行你定义的命名原生查询,不会再去解析不存在的实体属性,问题就能解决了。
内容的提问来源于stack exchange,提问作者Ferid Qelenderli
相关产品推荐
相关产品推荐

