您好,登錄后才能下訂單哦!
這篇文章主要介紹了SpringBoot如何使用JPA實現(xiàn)查詢部分字段,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
用過JPA的都知道,只需要繼承JpaRepository 根據(jù)Jpa的函數(shù)命名規(guī)范寫出接口中的函數(shù),不需要實現(xiàn),底層就可以自動解析成各種數(shù)據(jù)庫的sql語句,進(jìn)行增刪改查等操作。
如findByUserName,findByUserNameOrEmail(String username, String email)等條件的屬性名稱與個數(shù)要與參數(shù)的位置與個數(shù)一一對應(yīng),JpaRepository能夠解析方法名自動生成sql語句
主要的語法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟屬性名稱即可
關(guān)鍵詞 | 舉例 | 對應(yīng)的sql語句 |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate 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 | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collection age) | … where x.age not in ?1 |
TRUE | findByActiveTrue() | … where x.active = true |
FALSE | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
這種方式很簡單,但也有很多缺陷,不夠靈活,不用擔(dān)心,Spring data jpa還支持自定義查詢語句。
使用 @Query注解,添加JPQL語句,JPQL是一種面向?qū)ο蟮谋磉_(dá)式語言,通過類名和屬性訪問,而不是數(shù)據(jù)庫中的表名和屬性,避免了不同數(shù)據(jù)庫語法的不同。
在@Query中添加nativeQuery = true表示使用原生的sql語句,這時候就有要使用數(shù)據(jù)庫表名和字段名了。
當(dāng)涉及到刪除和修改在需要加上@Modifying.也可以根據(jù)需要添加 @Transactional對事物的支持,查詢超時的設(shè)置等。
使用JPA命名規(guī)范寫的函數(shù)能夠查詢出整個對象,而不能只查詢出一個或幾個字段,因為有時候我們只需要一個bean中的幾個字段就夠了,不需要全部的。
例如用戶表,根據(jù)id查姓名,就不需要把密碼等重要信息查出來了,因為這些信息封裝在一個對象中返回到前端是很危險的,即使沒有顯示,但也可以在瀏覽器上調(diào)試看到。
原生的sql當(dāng)然可以做到,但是我們還想讓查詢出的結(jié)果封裝成一個對象,以便后續(xù)的操作。
那么自定義的JPQL就可以實現(xiàn)這個功能了。
例如有一個用戶表,如下:
@Entity @Table(name = "yhb") public class YHB { //用戶編號 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer yhbh; //用戶代碼(名字拼音縮寫) private String yhdm; //用戶名稱 private String yhmc; //用戶密碼 private String yhkl; //用戶部門編號 private String yhbm; //用戶職務(wù) private String yhsf; //用戶手機號 private String phone; //省略構(gòu)造函數(shù)和get set
現(xiàn)在需要根據(jù)部門編號查詢出這個部門所有人的用戶編號和用戶名稱,那么我們可以新建一個Model,就只有用戶編號和用戶名稱這兩個字段:
YhbModel.java
public class YhbModel implements Serializable { private Integer yhbh; //用戶名稱 private String yhmc;
在用戶表的dao層可以這樣寫操作數(shù)據(jù)庫的方法:
@Repository public interface YhbDao extends JpaRepository<YHB,Integer>{ //根據(jù)部門查找用戶 @Transactional @Query(value = "select new com.nju.software.assessment.model.YhbModel(y.yhbh,y.yhmc) from YHB y where yhbm=?1") List<YhbModel> findYhmcByYhbm(String yhbm); }
@Query中的JPQL意思是根據(jù)用戶部門編號yhbm查詢用戶的實體類YHB中的用戶編號yhbh和用戶名稱yhmc,并把查詢出的結(jié)果封裝成一個YhbModel對象,List<YhbModel>中類型也是YhbModel類型的,之后的service層和controller層調(diào)用的時候返回類型也是List<YhbModel>。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“SpringBoot如何使用JPA實現(xiàn)查詢部分字段”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。