源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题


org.springframework.data.mapping.PropertyReferenceException: No property XXX found for type XXXXX!
终究的原因是spring-data-commons版本低导致的,升级到新版本就没问题了,或者在查询时添加的Sort中的Orderby参数 不带下划线就可以了
如果想了解源码的可以继续往下看,让你了解怎样去查看源码
起因是在用spring boot jpa时 findAll查询报错了
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
大概的意思是OrderForm这个类中不存在order属性
然而使用ctrl+f 去查询动态的predicate中也没有拼接这个属性
然后我们再来看看报错的原因
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
先看第一行,
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
1.打好断点进来,抛出异样的原因是74行为空,
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
owningType.getProperty(propertyName);
打断点可以看到owningType 就是对应的OrderForm的类也就是我们查询的映射类,从这句话也可以知道是propertyName出了问题,也就是入参的name出问题,第一个参数出问题 记住
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
接着我们根据报错一层一层向上找
2.at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329) 这个类的329行
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
329行 第一个参数 source 继续往上找
3.at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
还是第一个参数source 继续往上找
4.at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:272)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
272行的第一个参数是parts.next(),看上面的代码可以知道是通过source参数正则转换后获得的列表
记住依旧是第一个参数往上找
5.at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:243)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
6.at org.springframework.data.jpa.repository.query.QueryUtils.toJpaOrder(QueryUtils.java:543)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
依旧是第一个参数order中的property属性
7.at org.springframework.data.jpa.repository.query.QueryUtils.toOrders(QueryUtils.java:497)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
第一个参数order是来自sort,sort是入参中的第一个参数
8.at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:653)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
这里的sort是入参的第三个参数 Sort ,错误的地方也渐渐明朗了起来,可以猜出是Sort的属性导致的问题
9.at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:608)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
第三个参数sort是来自pageable,是第二个入参
10.at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:407)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
这里找到findAll了 就知道哪里的问题了 是入参pageable的问题导致
接下来查看自己的业务代码
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
我传入的pageable 定义了order_id字段作为orderby
重新断点进入一层层捕获,看看是哪个环节出问题

可以发现是之前的问题4的方法中出了问题,断点进入查看参数值
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
传入的 order_id 被
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
这两行正则后 变成了两个属性order,id
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
而之后又用这两个属性去判断是否属于映射的类中(这里即OrderForm)如下图
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
接着去github查最新的代码
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
github上最新的代码已经更新这句匹配的代码,(这句匹配分组应该是用来orderby多个字段解析的)
到这里已经根据查出了原因
本地的spring-data-commons是1.13.1的版本 而maven上已经到2.0.2了
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
所以还是用新一点稳定点的包比较靠谱
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题