spring-data-jpa原生sql查詢

隨着技術的發展,持久層框架也愈來愈趨於成熟,從Mybatis到JPA,新的技術都是使咱們使用起來更加方便簡單.就拿 JPA來講,因爲JPA自帶的方法能夠知足大部分平常開發中的crud,因此深得程序員們的喜好,可是,有利就有弊.html

近日我在開發中就遇到了一個關於查詢效率緩慢的問題.java

問題描述:

1.在開發環境有個業務,列表頁加搜索框功能,而後列表中數據是使用JPA的findAll()方法查詢2萬數據,居然整整須要7s,JPA雖然好用簡便,可是findall至關因而 SELECT * FROM tb where a,b,c,這種全表掃描效率低是確定的,並且是把表中全部字段都查了一遍,分頁後依舊不是很快,可是業務中只須要幾個字段而已,這其實就是極大的耗費資源.mysql

2.自定義sql語句下where條件該如何拼接而且判空,相似於mybatis的if null.程序員

3.自定義sql語句下如何進行分頁.spring

解決方案:

1.此刻加索引確定是不行的,where條件並不固定(全部搜索框爲空時是全查),因此就想到了利用JPA的@Query功能,將select * 替換爲具體須要的字段,select a,b,c from tb,就是寫原生sql語句,此時效率瞬間提升了很多,大概耗時1.2s,因此select * from tb 能不用則不用吧.性能問題解決了.sql

2.where條件的判空,就是當條件不爲null時進行查詢,結合google加實踐我弄出了這個方法:mybatis

@Query(value = " select name,age,sex where if(?1!= '',name = ?1,1=1) and if(?2!= null,age = ?2,1=1)", nativeQuery = true)
 List<Object[]> countCase(String name, Integer age, String sex)
複製代碼

if(?1 !='',name=?1,1=1) 表明傳入的參數name若是不爲""(String類型空是""而不是null)將參數傳入name,若是爲空時顯示1=1 表明參數爲真,對查詢結果不產生做用,所傳參數順序有要求.框架

3.查看文檔以後決定直接用JpaRepository 的 Pageable 來直接實現:性能

參考文檔(Example 51. Declare native count queries for pagination at the query method using [@Query])google

(docs.spring.io/spring-data…)

@Query(value = " select name,age,sex where if(?1!= '',name = ?1,1=1) and if(?2!= null,age = ?2,1=1) /*#pageable*/",countQuery = "select count(*) where if(?1!= '',name = ?1,1=1) and if(?2!= null,age = ?2,1=1)",nativeQuery = true)
 Page<Object[]> countCase(String name, Integer age, String sex,Pageable pageable)
複製代碼

countQuery用來獲取總條數.

**/#pageable/**在此處時必須添加,推測是JPA可能須要pageable字符來使工程正常啓動,若是不加則會啓動發生異常.

以上僅限於mysql

相關文章
相關標籤/搜索