用過JPA的都知道,只需要繼承JpaRepository 根據(jù)Jpa的函數(shù)命名規(guī)范寫出接口中的函數(shù)斜友,不需要實(shí)現(xiàn)贰谣,底層就可以自動(dòng)解析成各種數(shù)據(jù)庫(kù)的sql語(yǔ)句,進(jìn)行增刪改查等操作薛闪。
自定義簡(jiǎn)單的查詢方法:
如findByUserName辛馆,findByUserNameOrEmail(String username, String email)等條件的屬性名稱與個(gè)數(shù)要與參數(shù)的位置與個(gè)數(shù)一一對(duì)應(yīng),JpaRepository能夠解析方法名自動(dòng)生成sql語(yǔ)句,主要的語(yǔ)法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟屬性名稱即可昙篙,
這種方式很簡(jiǎn)單腊状,但也有很多缺陷,不夠靈活苔可,不用擔(dān)心缴挖,Spring data jpa還支持自定義查詢語(yǔ)句。
? ? 使用 @Query注解焚辅,添加JPQL語(yǔ)句映屋,JPQL是一種面向?qū)ο蟮谋磉_(dá)式語(yǔ)言,通過類名和屬性訪問同蜻,而不是數(shù)據(jù)庫(kù)中的表名和屬性棚点,避免了不同數(shù)據(jù)庫(kù)語(yǔ)法的不同。
? ? 在@Query中添加nativeQuery = true表示使用原生的sql語(yǔ)句湾蔓,這時(shí)候就有要使用數(shù)據(jù)庫(kù)表名和字段名了瘫析。
? ? 當(dāng)涉及到刪除和修改在需要加上@Modifying.也可以根據(jù)需要添加 @Transactional對(duì)事物的支持,查詢超時(shí)的設(shè)置等默责。
使用JPA命名規(guī)范寫的函數(shù)能夠查詢出整個(gè)對(duì)象贬循,而不能只查詢出一個(gè)或幾個(gè)字段,因?yàn)橛袝r(shí)候我們只需要一個(gè)bean中的幾個(gè)字段就夠了桃序,不需要全部的杖虾。
例如用戶表,根據(jù)id查姓名葡缰,就不需要把密碼等重要信息查出來了亏掀,因?yàn)檫@些信息封裝在一個(gè)對(duì)象中返回到前端是很危險(xiǎn)的,即使沒有顯示泛释,但也可以在瀏覽器上調(diào)試看到滤愕。
原生的sql當(dāng)然可以做到,但是我們還想讓查詢出的結(jié)果封裝成一個(gè)對(duì)象怜校,以便后續(xù)的操作间影。
那么自定義的JPQL就可以實(shí)現(xiàn)這個(gè)功能了。
例如有一個(gè)用戶表茄茁,如下
現(xiàn)在需要根據(jù)部門編號(hào)查詢出這個(gè)部門所有人的用戶編號(hào)和用戶名稱魂贬,那么我們可以新建一個(gè)Model,就只有用戶編號(hào)和用戶名稱這兩個(gè)字段:
YhbModel.java 該類需要包含相對(duì)應(yīng)的getter setter方法以及構(gòu)造方法。
在用戶表的dao層可以這樣寫操作數(shù)據(jù)庫(kù)的方法:
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ù)用戶部門編號(hào)yhbm查詢用戶的實(shí)體類YHB中的用戶編號(hào)yhbh和用戶名稱yhmc裙顽,并把查詢出的結(jié)果封裝成一個(gè)YhbModel對(duì)象,List<YhbModel>中類型也是YhbModel類型的付燥,之后的service層和controller層調(diào)用的時(shí)候返回類型也是List<YhbModel>。
原文鏈接:https://blog.csdn.net/jingyoushui/article/details/102875194