SpringBoot Jpa使用时碰到的问题总结二

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 {
    //当使用@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进行查询。

你可能感兴趣的:(SpringBoot Jpa使用时碰到的问题总结二)