Unable to locate Attribute with the the given name [descript] on this ManagedType [com.kjj.cloud.management.entity.DataCategoryCopy]
经过排查我找到了解决方案
处理方案
例如大哥报错信息是
Unable to locate Attribute with the the given name [PNum] on this ManagedType
我的实体字段是这样的p_num,但是在进行findByPNum的报错,原因是实体类声明字段大小写敏感。
经过查看原来:
Jpa查询的规则:
Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。
Eg.:findByTaskProjectName()
在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为A
先判断 taskProjectName (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
从右往左截取第一个大写字母开头的字符串此处为Name),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设task为查询实体Person的一个属性;
接着处理剩下部分(ProjectName),先判断 task 所对应的类型是否有projectName属性,如果有,则表示该方法最终是根据 “ Person.task.projectName”的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Person.task.project.name” 的值进行查询。
最后可能会存在一种特殊情况,比如 Person包含一个 task 的属性,也有一个 projectName 属性,此时会存在混淆。可以明确在属性之间加上 “_” 以显式表达意图,比如 “findByTask_ProjectName()”
得出的处理办法:
建议一开始设计时,设计字段符合驼峰规则。如果实在无法避免首字母必须大写,那么可以用@query进行查询。
————————————————
版权声明:本文为CSDN博主「带着希望活下去」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35746739/article/details/110863042