您的位置:首页 > 编程语言 > Java开发

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

2017-12-19 21:43 1236 查看
org.springframework.data.mapping.PropertyReferenceException: No property XXX found for type XXXXX!
终究的原因是spring-data-commons版本低导致的,升级到新版本就没问题了,或者在查询时添加的Sort中的Orderby参数 不带下划线就可以了
如果想了解源码的可以继续往下看,让你了解怎样去查看源码。
起因是在用spring boot jpa时 findAll查询报错了



大概的意思是OrderForm这个类中不存在order属性
然而使用ctrl+f 去查询动态的predicate中也没有拼接这个属性
然后我们再来看看报错的原因



先看第一行,

1.打好断点进来,抛出异样的原因是74行为空,



owningType.getProperty(propertyName);
打断点可以看到owningType 就是对应的OrderForm的类也就是我们查询的映射类,从这句话也可以知道是propertyName出了问题,也就是入参的name出问题,第一个参数出问题 记住



接着我们根据报错一层一层向上找
2.at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329) 这个类的329行



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)



272行的第一个参数是parts.next(),看上面的代码可以知道是通过source参数正则转换后获得的列表
记住依旧是第一个参数往上找
5.at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:243)



6.at org.springframework.data.jpa.repository.query.QueryUtils.toJpaOrder(QueryUtils.java:543)



依旧是第一个参数order中的property属性
7.at org.springframework.data.jpa.repository.query.QueryUtils.toOrders(QueryUtils.java:497)



第一个参数order是来自sort,sort是入参中的第一个参数
8.at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:653)



这里的sort是入参的第三个参数 Sort ,错误的地方也渐渐明朗了起来,可以猜出是Sort的属性导致的问题
9.at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:608)



第三个参数sort是来自pageable,是第二个入参
10.at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:407)



这里找到findAll了 就知道哪里的问题了 是入参pageable的问题导致
接下来查看自己的业务代码





我传入的pageable 定义了order_id字段作为orderby
重新断点进入一层层捕获,看看是哪个环节出问题

可以发现是之前的问题4的方法中出了问题,断点进入查看参数值





传入的 order_id 被

这两行正则后 变成了两个属性order,id



而之后又用这两个属性去判断是否属于映射的类中(这里即OrderForm)如下图



接着去github查最新的代码



github上最新的代码已经更新这句匹配的代码,(这句匹配分组应该是用来orderby多个字段解析的)
到这里已经根据查出了原因
本地的spring-data-commons是1.13.1的版本 而maven上已经到2.0.2了



所以还是用新一点稳定点的包比较靠谱
源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jpa 源码 spring