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进行查询。

————————————————