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進行查詢。