1.SpringBoot Jpa 查询方法的一个小问题。
具体是方法名和实体类属性名的大小写冲突问题。
首先具体查询规则是:
Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。
假如创建如下的查询:findByTaskProjectName(),框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为Doc
1.先判断 taskProjectName (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
2.从右往左截取第一个大写字母开头的字符串此处为Name),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设task为查询实体Person的一个属性;
3.接着处理剩下部分(ProjectName),先判断 task 所对应的类型是否有projectName属性,如果有,则表示该方法最终是根据 “ Person.task.projectName”的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Person.task.project.name” 的值进行查询。
4.最后可能会存在一种特殊情况,比如 Person包含一个 task 的属性,也有一个 projectName 属性,此时会存在混淆。可以明确在属性之间加上 “_” 以显式表达意图,比如 “findByTask_ProjectName()”
我举出的错误具体请见下方代码
//自定义的一个用户的jpa查询类
public interface SysUserRepository extends JpaRepository<SysUser, Integer> {
//当使用@query查询时,大小写的问题不会出现
//nativeQuery 设置是否使用原生sql ,true为使用。
@Query(value = "select * from SysUser where LoginName = ? ", nativeQuery = true)
public SysUser findByLoginname(String loginName);、
//会将查询中关键字提出(findBy),然后将LoginName转换为loginName(驼峰)
//这是,如果你的实体类中的字典不符合驼峰,将会报错
public SysUser findByLoginName(String loginName, String pwd);
}
下面是具体报错内容
Unable to locate Attribute with the the given name [loginName] on
this ManagedType [com.wlw.entity.user.SysUser]
处理办法,建议一开始设计时,设计字段符合驼峰规则。如果实在无法避免首字母必须大写,那么可以用@query进行查询。