SpringBoot使用JPA實現查詢部分字段
SpringBoot JPA查詢部分字段
用過JPA的都知道,只需要繼承JpaRepository 根據Jpa的函數命名規(guī)范寫出接口中的函數,不需要實現,底層就可以自動解析成各種數據庫的sql語句,進行增刪改查等操作。
自定義簡單的查詢方法
如findByUserName,findByUserNameOrEmail(String username, String email)等條件的屬性名稱與個數要與參數的位置與個數一一對應,JpaRepository能夠解析方法名自動生成sql語句
主要的語法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟屬性名稱即可
| 關鍵詞 | 舉例 | 對應的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) |
這種方式很簡單,但也有很多缺陷,不夠靈活,不用擔心,Spring data jpa還支持自定義查詢語句。
- 使用 @Query注解,添加JPQL語句,JPQL是一種面向對象的表達式語言,通過類名和屬性訪問,而不是數據庫中的表名和屬性,避免了不同數據庫語法的不同。
- 在@Query中添加nativeQuery = true表示使用原生的sql語句,這時候就有要使用數據庫表名和字段名了。
- 當涉及到刪除和修改在需要加上@Modifying.也可以根據需要添加 @Transactional對事物的支持,查詢超時的設置等。
使用JPA命名規(guī)范寫的函數能夠查詢出整個對象,而不能只查詢出一個或幾個字段,因為有時候我們只需要一個bean中的幾個字段就夠了,不需要全部的。
例如用戶表,根據id查姓名,就不需要把密碼等重要信息查出來了,因為這些信息封裝在一個對象中返回到前端是很危險的,即使沒有顯示,但也可以在瀏覽器上調試看到。
原生的sql當然可以做到,但是我們還想讓查詢出的結果封裝成一個對象,以便后續(xù)的操作。
那么自定義的JPQL就可以實現這個功能了。
例如有一個用戶表,如下:
@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;
//用戶職務
private String yhsf;
//用戶手機號
private String phone;
//省略構造函數和get set
現在需要根據部門編號查詢出這個部門所有人的用戶編號和用戶名稱,那么我們可以新建一個Model,就只有用戶編號和用戶名稱這兩個字段:
YhbModel.java
public class YhbModel implements Serializable {
private Integer yhbh;
//用戶名稱
private String yhmc;
在用戶表的dao層可以這樣寫操作數據庫的方法:
@Repository
public interface YhbDao extends JpaRepository<YHB,Integer>{
//根據部門查找用戶
@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意思是根據用戶部門編號yhbm查詢用戶的實體類YHB中的用戶編號yhbh和用戶名稱yhmc,并把查詢出的結果封裝成一個YhbModel對象,List<YhbModel>中類型也是YhbModel類型的,之后的service層和controller層調用的時候返回類型也是List<YhbModel>。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java基礎知識精通循環(huán)結構與break及continue
循環(huán)結構是指在程序中需要反復執(zhí)行某個功能而設置的一種程序結構。它由循環(huán)體中的條件,判斷繼續(xù)執(zhí)行某個功能還是退出循環(huán),選擇結構用于判斷給定的條件,根據判斷的結果判斷某些條件,根據判斷的結果來控制程序的流程2022-04-04
淺談SpringMVC中的session用法及細節(jié)記錄
下面小編就為大家?guī)硪黄獪\談SpringMVC中的session用法及細節(jié)記錄。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
SpringSecurity在SpringBoot中的自動裝配過程
這篇文章主要介紹了SpringSecurity在SpringBoot中的自動裝配過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07

