标签:task name 遇到 一个 截取 查询 问题 Person 属性
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
标签:task,name,遇到,一个,截取,查询,问题,Person,属性 来源: https://www.cnblogs.com/xxxxxz/p/15196001.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。