源码解析,浅谈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 中莫名的查询字段不存在问题_第1张图片
大概的意思是OrderForm这个类中不存在order属性
然而使用ctrl+f 去查询动态的predicate中也没有拼接这个属性
然后我们再来看看报错的原因

先看第一行,
1.打好断点进来,抛出异样的原因是74行为空,
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第2张图片
owningType.getProperty(propertyName);
打断点可以看到owningType 就是对应的OrderForm的类也就是我们查询的映射类,从这句话也可以知道是propertyName出了问题,也就是入参的name出问题, 第一个参数出问题 记住
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第3张图片
接着我们根据报错一层一层向上找
2.at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329) 这个类的329行
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第4张图片
329行 第一个参数 source 继续往上找
3.at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309)

还是第一个参数source 继续往上找
4.at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:272)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第5张图片
272行的第一个参数是parts.next(),看上面的代码可以知道是通过source参数正则转换后获得的列表
记住依旧是第一个参数往上找
5.at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:243)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第6张图片
6.at org.springframework.data.jpa.repository.query.QueryUtils.toJpaOrder(QueryUtils.java:543)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第7张图片
依旧是第一个参数order中的property属性
7.at org.springframework.data.jpa.repository.query.QueryUtils.toOrders(QueryUtils.java:497)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第8张图片
第一个参数order是来自sort,sort是入参中的第一个参数
8.at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:653)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第9张图片
这里的sort是入参的第三个参数 Sort ,错误的地方也渐渐明朗了起来,可以猜出是Sort的属性导致的问题
9.at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:608)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第10张图片
第三个参数sort是来自pageable,是第二个入参
10.at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:407)
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第11张图片
这里找到findAll了 就知道哪里的问题了 是入参pageable的问题导致
接下来查看自己的业务代码

源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第12张图片
我传入的pageable 定义了order_id字段作为orderby
重新断点进入一层层捕获,看看是哪个环节出问题

可以发现是之前的问题4的方法中出了问题,断点进入查看参数值
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第13张图片
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第14张图片
传入的 order_id 被
这两行正则后 变成了两个属性order,id

而之后又用这两个属性去判断是否属于映射的类中(这里即OrderForm)如下图
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第15张图片
接着去github查最新的代码
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第16张图片
github上最新的代码已经更新这句匹配的代码,(这句匹配分组应该是用来orderby多个字段解析的)
到这里已经根据查出了原因
本地的 spring-data-commons是1.13.1的版本 而maven上已经到2.0.2了
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题_第17张图片
所以还是用新一点稳定点的包比较靠谱
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题


你可能感兴趣的:(源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题)