paulwong

          SPRING DATA查詢方法

          SPRING DATA的REPOSITORY由于只是一個(gè)接口,沒有實(shí)現(xiàn)方法的,因此查詢就要結(jié)合注釋或方法進(jìn)行:
          通過解析方法名創(chuàng)建查詢
          通過前面的例子,讀者基本上對解析方法名創(chuàng)建查詢的方式有了一個(gè)大致的了解,這也是 Spring Data JPA 吸引開發(fā)者的一個(gè)很重要的因素。該功能其實(shí)并非 Spring Data JPA 首創(chuàng),而是源自一個(gè)開源的 JPA 框架 Hades,該框架的作者 Oliver Gierke 本身又是 Spring Data JPA 項(xiàng)目的 Leader,所以把 Hades 的優(yōu)勢引入到 Spring Data JPA 也就是順理成章的了。


          框架在進(jìn)行方法名解析時(shí),會(huì)先把方法名多余的前綴截取掉,比如 find、findBy、read、readBy、get、getBy,然后對剩下部分進(jìn)行解析。并且如果方法的最后一個(gè)參數(shù)是 Sort 或者 Pageable 類型,也會(huì)提取相關(guān)的信息,以便按規(guī)則進(jìn)行排序或者分頁查詢。


          在創(chuàng)建查詢時(shí),我們通過在方法名中使用屬性名稱來表達(dá),比如 findByUserAddressZip ()。框架在解析該方法時(shí),首先剔除 findBy,然后對剩下的屬性進(jìn)行解析,詳細(xì)規(guī)則如下(此處假設(shè)該方法針對的域?qū)ο鬄?AccountInfo 類型):


          先判斷 userAddressZip (根據(jù) POJO 規(guī)范,首字母變?yōu)樾懀峦┦欠駷?AccountInfo 的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒有該屬性,繼續(xù)第二步;


          從右往左截取第一個(gè)大寫字母開頭的字符串(此處為 Zip),然后檢查剩下的字符串是否為 AccountInfo 的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒有該屬性,則重復(fù)第二步,繼續(xù)從右往左截取;最后假設(shè) user 為 AccountInfo 的一個(gè)屬性;


          接著處理剩下部分( AddressZip ),先判斷 user 所對應(yīng)的類型是否有 addressZip 屬性,如果有,則表示該方法最終是根據(jù) "AccountInfo.user.addressZip" 的取值進(jìn)行查詢;否則繼續(xù)按照步驟 2 的規(guī)則從右往左截取,最終表示根據(jù) "AccountInfo.user.address.zip" 的值進(jìn)行查詢。


          可能會(huì)存在一種特殊情況,比如 AccountInfo 包含一個(gè) user 的屬性,也有一個(gè) userAddress 屬性,此時(shí)會(huì)存在混淆。讀者可以明確在屬性之間加上 "_" 以顯式表達(dá)意圖,比如 "findByUser_AddressZip()" 或者 "findByUserAddress_Zip()"。


          在查詢時(shí),通常需要同時(shí)根據(jù)多個(gè)屬性進(jìn)行查詢,且查詢的條件也格式各樣(大于某個(gè)值、在某個(gè)范圍等等),Spring Data JPA 為此提供了一些表達(dá)條件查詢的關(guān)鍵字,大致如下:


          And --- 等價(jià)于 SQL 中的 and 關(guān)鍵字,比如 findByUsernameAndPassword(String user, Striang pwd);

          Or --- 等價(jià)于 SQL 中的 or 關(guān)鍵字,比如 findByUsernameOrAddress(String user, String addr);

          Between --- 等價(jià)于 SQL 中的 between 關(guān)鍵字,比如 findBySalaryBetween(int max, int min);

          LessThan --- 等價(jià)于 SQL 中的 "<",比如 findBySalaryLessThan(int max);

          GreaterThan --- 等價(jià)于 SQL 中的">",比如 findBySalaryGreaterThan(int min);

          IsNull --- 等價(jià)于 SQL 中的 "is null",比如 findByUsernameIsNull();

          IsNotNull --- 等價(jià)于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();

          NotNull --- 與 IsNotNull 等價(jià);

          Like --- 等價(jià)于 SQL 中的 "like",比如 findByUsernameLike(String user);

          NotLike --- 等價(jià)于 SQL 中的 "not like",比如 findByUsernameNotLike(String user);

          OrderBy --- 等價(jià)于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);

          Not --- 等價(jià)于 SQL 中的 "! =",比如 findByUsernameNot(String user);

          In --- 等價(jià)于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的參數(shù)可以是 Collection 類型,也可以是數(shù)組或者不定長參數(shù);

          NotIn --- 等價(jià)于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的參數(shù)可以是 Collection 類型,也可以是數(shù)組或者不定長參數(shù);


          同時(shí)我們也可以自定義自己的方式查詢通過@Query注解 這里可以參考http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/ 這篇文章,注意的是JPA 所以@query里面的內(nèi)容是HQL 如果是mongodb那么語法就是mongodb的查詢語法 neo4j就是neo4j的查詢語法

          posted on 2013-11-17 11:38 paulwong 閱讀(442) 評論(0)  編輯  收藏 所屬分類: SPRINGMONGODB

          主站蜘蛛池模板: 宣化县| 周至县| 汕头市| 黔西| 福海县| 汨罗市| 卓尼县| 金乡县| 辰溪县| 富川| 海淀区| 改则县| 左云县| 商水县| 论坛| 察隅县| 广宗县| 赞皇县| 廊坊市| 万山特区| 浮梁县| 商河县| 伊川县| 信阳市| 青浦区| 肃宁县| 岳池县| 濉溪县| 皋兰县| 汶上县| 台东市| 泸溪县| 澄江县| 武宁县| 师宗县| 贵南县| 宁海县| 醴陵市| 临高县| 陈巴尔虎旗| 安康市|