您好,登錄后才能下訂單哦!
這篇文章主要介紹“Spring JPA之find拓展方法有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring JPA之find拓展方法有哪些”文章能幫助大家解決問題。
類似 select * from * where 條件
的查詢
Dao 層(因為已經不是自帶方法了,所以需要在Dao添加接口)
User findByName(String name);
控制臺打印如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
Dao 層
/** * 小于age的數據 * @param age * @return */ List<User> findByAgeLessThan(int age); /** * 小于等于age的數據 * @param age * @return */ List<User> findByAgeLessThanEqual(int age);
控制臺打印如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.age<?
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.age<=?
其他的“>”就是findByAgeGreaterThan
,“>=”就是findByAgeGreaterThanEqual
等等
Dao 層
/** * age在ageLeft和ageRight之間的數據 * @param ageLeft * @param ageRight * @return */ List<User> findByAgeBetween(int ageLeft,int ageRight);
控制臺打印如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.age between ? and ?
Dao 層
/**java * age在ints內的數據 * @param ages * @return */ List<User> findByAgeIn(int[] ages);
控制臺打印如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.age in ( ? , ? )
findByAgeNotIn
的查詢跟in結果是相對的,但是用法是一樣的,傳入的參數也是數組
模糊查詢無非就是 like 語句,這里我們就不詳細討論 like 如何使用了,只介紹一下 JPA 中的 like 如何去實現。
以下是Dao 層的like實現的各接口:
public List<User> findByNameLike(String name){ return userDao.findByNameLike(name); } public List<User> findByNameStartingWith(String name){ return userDao.findByNameStartingWith(name); } public List<User> findByNameStartsWith(String name){ return userDao.findByNameStartsWith(name); } public List<User> findByNameEndingWith(String name){ return userDao.findByNameEndingWith(name); } public List<User> findByNameContaining(String name){ return userDao.findByNameContaining(name); }
上面雖然有5個不同的接口,但是控制臺打印卻是一致的,如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name like ? escape ?
那他們5個具體有啥區別呢?不急,我們詳細看看:
請求url findByNameLike?name=aa
,控制臺打印入參如下:
binding parameter [1] as [VARCHAR] - [aa]
從輸入值可以看出,單獨的like你傳什么就將什么放在like后面;如果傳的是純字符,則相當于精確查詢;如果你加上“%”,那就可以進行模糊查詢了:findByNameLike?name=%25aa
(url中的“%”轉義為“%25”),控制臺打印入參如下:
binding parameter [1] as [VARCHAR] - [%aa]
請求urlfindByNameStartingWith?name=aa
,控制臺打印入參如下:
binding parameter [1] as [VARCHAR] - [aa%]
從輸入值來看,這個就是獲取以“aa”開頭的所有數據,其實從名字也可以看出來他的實際作用。后面的findByNameStartsWith
跟這個的作用是一樣的。
以此類推:findByNameEndingWith(aa)
、findByNameEndsWith(aa)
: 輸入值應為 [%aa],就是獲取以“aa”為結尾的所有數據;findByNameContaining(aa)
:輸入值應為 [%aa%]\,就是獲取任意位置包含“aa”的數據。
類似select* from * where 條件1 and 條件2
Dao 層
User findByNameAndAge(String name, int age);
控制臺打印如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=? and user0_.age=?
多條件查詢其實就是多個單條件查詢所疊加的效果;主要使用 and 來表示同時滿足多個條件的結果,而 or 用于表示滿足其中一個條件的結果。
以下是整理的JPA支持的關鍵字,大家可以自行取之。
關鍵字 | 示例 | JPQL片段 |
---|---|---|
And | findByNameAndAge | ... where x.name = ?1 and x.age = ?2 |
Or | findByNameOrAge | ... where x.name = ?1 or x.age = ?2 |
Is,Equals | findByName,findByNameIs,findByNameEquals | ... where x.name = ?1 |
Between | findByAgeBetween | ... where x.age between ?1 and ?2 |
LessThan | findByAgeLessThan | ... where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | ... where x.age <= ?1 |
GreaterThan | findByAgeGreaterThan | ... where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | ... where x.age >= ?1 |
After | findByAgeAfter | ... where x.age > ?1 |
Before | findByAgeBefore | ... where x.age< ?1 |
IsNull | findByAgeIsNull | ... where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | ... 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 (參數會綁定到%后面) |
EndingWith | findByNameEndingWith | ... where x.name like ?1 (參數會綁定在%前面) |
Containing | findByNameContaining | ... where x.name like ?1 (參數會綁定在兩個%中間) |
OrderBy | findByAgeOrderByNameDesc | ... where x.age = ?1 order by name desc |
Not | findByNameNot | ... where x.name <> ?1 |
In | findByAgeIn(Collection ages) | ... where x.age in ?1 |
NotIn | findByAgeNotIn(Connection ages) | ... where x.age not in ?1 |
True | findByActiveTrue() | ... where x.active = true |
Flase | findByActiveFalse() | ... where x.active = false |
IgnoreCase | findByNameIgnoreCase | ... where UPPER(x.name) = UPPER(?1) |
關于“Spring JPA之find拓展方法有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。