SpringBoot使用JPA實(shí)現(xiàn)查詢(xún)部分字段
SpringBoot JPA查詢(xún)部分字段
用過(guò)JPA的都知道,只需要繼承JpaRepository 根據(jù)Jpa的函數(shù)命名規(guī)范寫(xiě)出接口中的函數(shù),不需要實(shí)現(xiàn),底層就可以自動(dòng)解析成各種數(shù)據(jù)庫(kù)的sql語(yǔ)句,進(jìn)行增刪改查等操作。
自定義簡(jiǎn)單的查詢(xún)方法
如findByUserName,findByUserNameOrEmail(String username, String email)等條件的屬性名稱(chēng)與個(gè)數(shù)要與參數(shù)的位置與個(gè)數(shù)一一對(duì)應(yīng),JpaRepository能夠解析方法名自動(dòng)生成sql語(yǔ)句
主要的語(yǔ)法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟屬性名稱(chēng)即可
關(guān)鍵詞 | 舉例 | 對(duì)應(yīng)的sql語(yǔ)句 |
---|---|---|
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) |
這種方式很簡(jiǎn)單,但也有很多缺陷,不夠靈活,不用擔(dān)心,Spring data jpa還支持自定義查詢(xún)語(yǔ)句。
- 使用 @Query注解,添加JPQL語(yǔ)句,JPQL是一種面向?qū)ο蟮谋磉_(dá)式語(yǔ)言,通過(guò)類(lèi)名和屬性訪問(wèn),而不是數(shù)據(jù)庫(kù)中的表名和屬性,避免了不同數(shù)據(jù)庫(kù)語(yǔ)法的不同。
- 在@Query中添加nativeQuery = true表示使用原生的sql語(yǔ)句,這時(shí)候就有要使用數(shù)據(jù)庫(kù)表名和字段名了。
- 當(dāng)涉及到刪除和修改在需要加上@Modifying.也可以根據(jù)需要添加 @Transactional對(duì)事物的支持,查詢(xún)超時(shí)的設(shè)置等。
使用JPA命名規(guī)范寫(xiě)的函數(shù)能夠查詢(xún)出整個(gè)對(duì)象,而不能只查詢(xún)出一個(gè)或幾個(gè)字段,因?yàn)橛袝r(shí)候我們只需要一個(gè)bean中的幾個(gè)字段就夠了,不需要全部的。
例如用戶表,根據(jù)id查姓名,就不需要把密碼等重要信息查出來(lái)了,因?yàn)檫@些信息封裝在一個(gè)對(duì)象中返回到前端是很危險(xiǎn)的,即使沒(méi)有顯示,但也可以在瀏覽器上調(diào)試看到。
原生的sql當(dāng)然可以做到,但是我們還想讓查詢(xún)出的結(jié)果封裝成一個(gè)對(duì)象,以便后續(xù)的操作。
那么自定義的JPQL就可以實(shí)現(xiàn)這個(gè)功能了。
例如有一個(gè)用戶表,如下:
@Entity @Table(name = "yhb") public class YHB { //用戶編號(hào) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer yhbh; //用戶代碼(名字拼音縮寫(xiě)) private String yhdm; //用戶名稱(chēng) private String yhmc; //用戶密碼 private String yhkl; //用戶部門(mén)編號(hào) private String yhbm; //用戶職務(wù) private String yhsf; //用戶手機(jī)號(hào) private String phone; //省略構(gòu)造函數(shù)和get set
現(xiàn)在需要根據(jù)部門(mén)編號(hào)查詢(xún)出這個(gè)部門(mén)所有人的用戶編號(hào)和用戶名稱(chēng),那么我們可以新建一個(gè)Model,就只有用戶編號(hào)和用戶名稱(chēng)這兩個(gè)字段:
YhbModel.java
public class YhbModel implements Serializable { private Integer yhbh; //用戶名稱(chēng) private String yhmc;
在用戶表的dao層可以這樣寫(xiě)操作數(shù)據(jù)庫(kù)的方法:
@Repository public interface YhbDao extends JpaRepository<YHB,Integer>{ //根據(jù)部門(mén)查找用戶 @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ù)用戶部門(mén)編號(hào)yhbm查詢(xún)用戶的實(shí)體類(lèi)YHB中的用戶編號(hào)yhbh和用戶名稱(chēng)yhmc,并把查詢(xún)出的結(jié)果封裝成一個(gè)YhbModel對(duì)象,List<YhbModel>中類(lèi)型也是YhbModel類(lèi)型的,之后的service層和controller層調(diào)用的時(shí)候返回類(lèi)型也是List<YhbModel>。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java基礎(chǔ)知識(shí)精通循環(huán)結(jié)構(gòu)與break及continue
循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個(gè)功能而設(shè)置的一種程序結(jié)構(gòu)。它由循環(huán)體中的條件,判斷繼續(xù)執(zhí)行某個(gè)功能還是退出循環(huán),選擇結(jié)構(gòu)用于判斷給定的條件,根據(jù)判斷的結(jié)果判斷某些條件,根據(jù)判斷的結(jié)果來(lái)控制程序的流程2022-04-04SpringBoot集成cache緩存的實(shí)現(xiàn)
日常開(kāi)發(fā)中,緩存是解決數(shù)據(jù)庫(kù)壓力的一種方案,本文記錄springboot中使用cache緩存。需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06Spring多數(shù)據(jù)源導(dǎo)致配置失效的解決
這篇文章主要介紹了Spring多數(shù)據(jù)源導(dǎo)致配置失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01java學(xué)習(xí)之jar包的下載和導(dǎo)入
我們經(jīng)常碰到有些jar包在中央倉(cāng)庫(kù)沒(méi)有的情況,這時(shí)候我們需要導(dǎo)入,這篇文章主要給大家介紹了關(guān)于java學(xué)習(xí)之jar包的下載和導(dǎo)入的相關(guān)資料,需要的朋友可以參考下2023-06-06java用重定向方法從文件中讀入或?qū)懭霐?shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了用重定向方法從文件中讀入或?qū)懭霐?shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03javaWeb使用驗(yàn)證碼實(shí)現(xiàn)簡(jiǎn)單登錄
這篇文章主要為大家詳細(xì)介紹了javaWeb使用驗(yàn)證碼實(shí)現(xiàn)簡(jiǎn)單登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08淺談SpringMVC中的session用法及細(xì)節(jié)記錄
下面小編就為大家?guī)?lái)一篇淺談SpringMVC中的session用法及細(xì)節(jié)記錄。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05SpringSecurity在SpringBoot中的自動(dòng)裝配過(guò)程
這篇文章主要介紹了SpringSecurity在SpringBoot中的自動(dòng)裝配過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07