javascript
Spring Data JPA 从入门到精通~方法的查询策略的属性表达式
方法的查詢策略的屬性表達式(Property Expressions)
屬性表達式只能引用托管(泛化)實體的直接屬性,如前一個示例所示。在查詢創建時,已經確保解析的屬性是托管實體的屬性,但是,還可以通過遍歷嵌套屬性定義約束。假設一個 Person 實體對象里面有一個 Address 的屬性里面包含一個 ZipCode 屬性。
在這種情況下,方法名為:
List<Person> findByAddressZipCode(String zipCode);
創建及其查找的過程是:解析算法首先將整個 part(AddressZipCode)解釋為屬性,并使用該名稱(uncapitalized)檢查域類的屬性,如果算法成功,則使用該屬性,如果不是,則算法拆分了從右側的駝峰部分的信號源到頭部和尾部,并試圖找出相應的屬性。在我們的例子中,AddressZip 和 Code 如果算法找到一個具有該頭部的屬性,那么它需要尾部,并從那里繼續構建樹,然后按照剛剛描述的方式將尾部分割,如果第一個分割不匹配,則算法將分割點移動到左(Address,ZipCode),然后繼續。
雖然這在大多數情況下應該起作用,但算法可能會選擇錯誤的屬性。假設 Person 該類也有一個 addressZip 屬性,該算法將在第一個分割輪中匹配,并且基本上選擇錯誤的屬性,最后失敗(因為該類型 addressZip 可能沒有 code 屬性)。
要解決這個歧義,可以在方法名稱中使用手動定義遍歷點,所以我們的方法名稱最終會如此:
List<Person> findByAddress_ZipCode(ZipCode zipCode);
當然 Spring JPA 里面是將下劃線視為保留字符,但是強烈建議遵循標準 Java 命名約定(即不使用屬性名稱中的下劃線,而是使用駱駝案例),屬性命名的時候注意下這個特性。
可以到 PartTreeJpaQuery.class 查詢一下相關的 method 的 name 的拆分和實現邏輯,也可以利用開發工具的 Search anywhere 視圖輸入 PropertyExpression,然后 Find Used 就可以跟出很多源碼,然后設置個斷點,就可以進行分析了。
總結
以上是生活随笔為你收集整理的Spring Data JPA 从入门到精通~方法的查询策略的属性表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无法初始化链接服务器 (null) 的
- 下一篇: gradle idea java ssm