1. 程式人生 > >SpringDataJpa——JpaRepository查詢功能

SpringDataJpa——JpaRepository查詢功能

原文連結:http://blog.csdn.net/ming070423/article/details/22086169

1.JpaRepository支援介面規範方法名查詢。意思是如果在介面中定義的查詢方法符合它的命名規則,就可以不用寫實現,目前支援的關鍵字如下。

Keyword Sample JPQL snippet
IsNotNull findByAgeNotNull ...  where x.age not null
Like findByNameLike ...  where x.name like ?1
NotLike findByNameNotLike ...  where x.name not like ?1
StartingWith findByNameStartingWith ...  where x.name like ?1(parameter bound with appended %)
EndingWith findByNameEndingWith ...  where x.name like ?1(parameter bound with prepended %)
Containing findByNameContaining ...  where x.name like ?1(parameter bound wrapped in %)
OrderBy findByAgeOrderByName ...  where x.age = ?1 order by x.name desc
Not findByNameNot ...  where x.name <> ?1
In findByAgeIn ...  where x.age in ?1
NotIn findByAgeNotIn ...  where x.age not in ?1
True findByActiveTrue ...  where x.avtive = true
Flase findByActiveFalse ...  where x.active = false
And  findByNameAndAge ...  where x.name = ?1 and x.age = ?2
Or findByNameOrAge ...  where x.name = ?1 or x.age = ?2
Between findBtAgeBetween ...  where x.age between ?1 and ?2
LessThan findByAgeLessThan ...  where x.age  <  ?1
GreaterThan findByAgeGreaterThan ...  where x.age > ?1
After/Before ... ...
IsNull findByAgeIsNull ...  where x.age is null

2.JpaRepository相關查詢功能

a.spring Data JPA框架在進行方法名解析時,會先把方法名多餘的字首擷取掉,比如find、findBy、read、readBy、get、getBy,然後對剩下部分進行解析。

b.假如建立如下的查詢:findByUserDepUuid(),框架在解析該方法時,首先剔除
findBy,然後對剩下的屬性進行解析,假設查詢實體為Doc。

1:先判斷userDepUuid (根據POJO 規範,首字母變為小寫)是否為查詢實體的一個

屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,繼續第二步;

2:從右往左擷取第一個大寫字母開頭的字串此處為Uuid),然後檢查剩下的字串是

否為查詢實體的一個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,

則重複第二步,繼續從右往左擷取;最後假設user為查詢實體的一個屬性;

3:接著處理剩下部分(DepUuid),先判斷user 所對應的型別是否有depUuid屬性,如

果有,則表示該方法最終是根據“ Doc.user.depUuid” 的取值進行查詢;否則繼

續按照步驟2 的規則從右往左擷取,最終表示根據“Doc.user.dep.uuid” 的值進

行查詢。

4:可能會存在一種特殊情況,比如Doc包含一個user 的屬性,也有一個userDep 屬

性,此時會存在混淆。可以明確在屬性之間加上"_" 以顯式表達意圖,比如

"findByUser_DepUuid()" 或者"findByUserDep_uuid()"

c.特殊的引數: 還可以直接在方法的引數上加入分頁或排序的引數,比如:
Page<UserModel> findByName(String name, Pageable pageable);
List<UserModel> findByName(String name, Sort sort);

d.也可以使用JPA的NamedQueries,方法如下:

1:在實體類上使用@NamedQuery,示例如下:
@NamedQuery(name = "UserModel.findByAge",query = "select o from UserModel
o where o.age >= ?1")
2:在自己實現的DAO的Repository接口裡面定義一個同名的方法,示例如下:
public List<UserModel> findByAge(int age);
3:然後就可以使用了,Spring會先找是否有同名的NamedQuery,如果有,那麼就不
會按照介面定義的方法來解析。

e.還可以使用@Query來指定本地查詢,只要設定nativeQuery為true,比如:
@Query(value="select * from tbl_user where name like %?1" ,nativeQuery=true)
public List<UserModel> findByUuidOrAge(String name);

注意:當前版本的本地查詢不支援翻頁和動態的排序

f.使用命名化引數,使用@Param即可,比如:
@Query(value="select o from UserModel o where o.name like %:nn")
public List<UserModel> findByUuidOrAge(@Param("nn") String name);

g.同樣支援更新類的Query語句,新增@Modifying即可,比如:
@Modifying
@Query(value="update UserModel o set o.name=:newName where o.name like %:nn")
public int findByUuidOrAge(@Param("nn") String name,@Param("newName") String
newName);
注意:
1:方法的返回值應該是int,表示更新語句所影響的行數
2:在呼叫的地方必須加事務,沒有事務不能正常執行

f.建立查詢的順序
Spring Data JPA 在為介面建立代理物件時,如果發現同時存在多種上述
情況可用,它該優先採用哪種策略呢?
<jpa:repositories> 提供了query-lookup-strategy 屬性,用以指定查
找的順序。它有如下三個取值:

1:create-if-not-found:如果方法通過@Query指定了查詢語句,則使用該語句實現
查詢;如果沒有,則查詢是否定義了符合條件的命名查詢,如果找到,則使用該
命名查詢;如果兩者都沒有找到,則通過解析方法名字來建立查詢。這是querylookup-
strategy 屬性的預設值
2:create:通過解析方法名字來建立查詢。即使有符合的命名查詢,或者方法通過
@Query指定的查詢語句,都將會被忽略
3:use-declared-query:如果方法通過@Query指定了查詢語句,則使用該語句實現
查詢;如果沒有,則查詢是否定義了符合條件的命名查詢,如果找到,則使用該
命名查詢;如果兩者都沒有找到,則丟擲異常

相關推薦

SpringDataJpa——JpaRepository查詢功能

原文連結:http://blog.csdn.net/ming070423/article/details/22086169 1.JpaRepository支援介面規範方法名查詢。意思是如果在介面中定義的查詢方法符合它的命名規則,就可以不用寫實現,目前支援的關鍵字如下。 K

一步一步學SpringDataJpa——JpaRepository基本功能(Curd)

1.UserService /** * * Copyright: Copyright (c) 2012 Asiainfo-Linkage * * [email protected]:2014-3-25 * @ClassName: UserService.

【SpringBoot學習筆記】SpringBoot_01_SpringData—JpaRepository查詢功能

1.JpaRepository支援介面規範方法名查詢 如果在介面中定義的查詢方法符合它的命名規則,就可以不用寫實現類 2.相關功能查詢 a.Spring Data JPA框架在進行方法名解析時

分頁功能 與 分類查詢功能合並

nat hidden 後臺 item ble fas turn items where 功能的合並 首要的就是要找出兩個功能的共同點。這裏主要是用Response展示數據,通過tsql語句查詢的集合作為數據源,所以這裏將兩個tsql合並,來實現功能的合並。 面板界面代碼:

JavaScript根據Json數據來做的模糊查詢功能

處理 false 通過 開始 方法 this eve fin 香瓜 類似於百度搜索框的模糊查找功能 需要有有已知數據,實現搜索框輸入字符,然後Js進行匹配,然後可以通過鼠標點擊顯示的內容,把內容顯示在搜索框中 當然了,正則只是很簡單的字符匹配,不具備多麽復雜的判斷 <

mysql慢查詢功能詳解

mysql 慢查詢 優化有人的地方就有江湖,數據庫也是,sql優化這個問題,任重道遠,我們總是禁不住有爛sql。怎麽辦呢,還好各大數據庫都有相關爛sql的收集功能,而mysql的慢查詢收集也是異曲同工,配合分析sql的執行計劃,這個優化就有了搞頭了。開啟mysql慢查詢日誌1.查看當前慢查詢設置情況#查看慢查

語音識別完成詩句的查詢功能,iOS AVSpeechSynthesis語音輸出結果的詩歌APP

water 兩個 min 介紹 ech fin com esp log 前言 當前的APP的查詢都是使用手動輸入,不僅效率低,而且查詢的語句的限制比較大,不能夠方便的擴展。 如果能方便的擴展查詢語句,那麽APP的使用就會有很大的靈活性。可以設計各種問句和語句,可以方便的和用

C#實現百度網站收錄和排名查詢功能思路及實例

重構 策略 www protected 交互 得出 完成 def 表達式 一、前言 偶然一次在vs2012默認的項目文件夾裏發現了以前自己做的一個關於SEO的類庫,主要是用來查詢某個網址的收錄次數還有網站的排行數,後來重構了下,今天拿出來寫篇文章,說說自己是如何思考的

Python與數據庫[2] -> 關系對象映射/ORM -> 利用 sqlalchemy 實現關系表查詢功能

none 標準 ica accounts like imp 函數 參數形式 char 利用 sqlalchemy 實現關系表查詢功能 下面的例子將完成一個通過關系表進行查詢的功能,示例中的數據表均在MySQL中建立,建立過程可以使用 SQL 命令或編寫 Python

codeigniter框架使用筆記,查詢功能,搜索功能php版。自己留個記錄

jquer 資源文件 導致 utf-8 base inline fail spa aop 控制器Zhaopin.php <?php session_start(); class Zhaopin extends CI_Controller { publi

查詢功能

clas div 輸入 str delete 循環 int 刪除 tag 1 tag = True 2 while tag: 3 # print(‘請輸入:1\n2\n3\n4\n‘) 4 if tag: 5 print(‘lev

名片管理系統(添加及查詢功能)

python#_*_ conding:utf-8 _*_ #1.打印功能提示 print("="*50) print(" 名片管理系統 V1.0") print(" 1:添加一個新的名片") print(" 2:刪除一個名片") print(" 3:修改一個名片") print(" 4:查詢一個名片")

基於bootstrap selectpicker ,實現select下拉框模糊查詢功能

sele TP 選擇器 art 基於 i++ 同時 html .html 1、html代碼塊 需要引入bootstrap的css js jquery bootstrap.css bootstrap-select.min.css jquery-

學習ASP.NET Core Razor 編程系列九——增加查詢功能

方法的參數 將在 代碼 教程 ali 表示 得到 asp.net context 學習ASP.NET Core Razor 編程系列目錄 學習ASP.NET Core Razor 編程系列一 學習ASP.NET Core Razor 編程系列二—&mdash

分布式網上商城項目-項目查詢功能錯誤

ces price PC fabric default fir 運行 spa isp 1、Jdbc內存泄露問題 1 嚴重: The web application [] registered the JDBC driver [com.alibaba.druid.

SpringDataJPA模糊查詢

語句 拼接 lean list ctc int contain tty spa 遇到的情況:在做短信渠道管理添加時,先要去校驗數據庫中是否有該產線-短信類型-渠道的記錄,如果存在就不添加。 //在庫中是否存在該記錄 private boolean ifExistC

楊澤業:wordpress博客開發技巧之添加快遞查詢功能

width part 是否 講解 lin port 位置 ESS number 前幾天,我說到了給你的博客添加《漢字轉拼音》和《二維碼在線生成》的功能,這兩個功能都是額外增加的,而且是可以增加在任何的網站裏面,今天講的是wordpress博客功能開發,是在wordpress

帶輸入查詢功能匹配下拉框的幾種實現方式

sae idt hwnd 就會 bfd bmgr 使用方法 oaf adt 在Web開發中我們經常需要用戶進行輸入操作,輸入框內我們輸入幾個字,輸入框就會出現下拉提示你可能要輸入的完整信息。下面我總結了幾種常見的方案: 一:EasyUi combobox 組合框 具體使用方

django實現查詢功能

use dia ext bubuko var pull arc settings bsp 1.index首頁顯示 <div class="form-group pull-right" style="float: left"&g

LigerUI真假分頁以及過濾查詢功能

     前端時間寫過ligerUI頁面框架顯示JSON資料,最近博友問的最多的問題是ligerUI中過濾條件where屬性的使用以及分頁顯示的問題。   為了答疑同時為了總結,做了相應的測試demo,現在寫出來分享一下。