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