隨筆-95  評論-31  文章-10  trackbacks-0
          問題:
          1:一般情況下,用spring-boot data jpa查詢sql稍有點多,本來一條sql解決的事情,一定要幾條, 如何優化成一條sql解決,還能帶上分頁?
          2:這個時候@Query注解里面的nativeQuery就可以派上用場 (用left join fetch也可以優化成一條sql,見http://www.aygfsteel.com/liuguly/archive/2017/11/13/432890.html)
          3:nativeQuery的用途是可以使用原生sql。

          經過實踐,官網給出的示例無法跑通:


          解決方法:
          1: 先按照上述官網示例進行配置。
          2: 示例:
          @Repository
          public interface BabySittingDao extends PagingAndSortingRepository<BabySitting, Long> {

              /**
               * 獲取喜歡的sharecare列表
               * 
          @param accountId 當前用戶id
               * 
          @param fType 喜歡的類型  0-> sharecare  1-> babysitting  2->event
               * 
          @param pageable 分頁
               * 
          @return 分頁結果
               
          */
              @Query(value = "SELECT s.* FROM sharecare.sb_baby_sitting s WHERE s.id IN (" +
                      "SELECT f.f_type_id FROM sharecare.sb_favorite f WHERE f.f_type=?2 AND f.owner_id=?1)  ORDER BY ?#{#pageable}",
                      countQuery = "SELECT COUNT (*) FROM  (SELECT s.* FROM sharecare.sb_baby_sitting s WHERE s.id IN " +
                              "(SELECT f.f_type_id FROM sharecare.sb_favorite f WHERE f.f_type=?2 AND f.owner_id=?1))",
                      nativeQuery = true)
              Page<BabySitting> findFavoriteBabySitting(Long accountId, Integer fType, Pageable pageable);

          說明:@Query里面的value是原生sql 、countQuery表示查詢總數、nativeQuery表示這是一條原生sql

          注意點:
          1: 這個接口方法findFavoriteBabySitting一定要放在當前領域模型的Dao接口里面,不能放在其它Dao接口中,否則就是網上流傳的類型轉換錯誤!
          2: 見紅色標注,一定要這樣寫,不能ORDER BY ?3這樣寫,也不能ORDER BY #{#pageable}這樣寫,否則就是網上流傳的各種錯!
          3: 一定要加nativeQuery=true

          經過以上配置,就可正確查詢出結果且自帶分頁!

          完!

          關于領域模型的補充說明:
          1:不管實體類的屬性如何命名哪怕是abcdef,只要配置好映射即:@Column注解對應的表字段。
          2:那么以上所述的查詢方式,仍然能正確返回結果,正確映射成Page<領域模型>。

          posted on 2017-11-14 14:20 朔望魔刃 閱讀(5657) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 柏乡县| 永靖县| 芦山县| 杭州市| 乌鲁木齐县| 兴业县| 闽清县| 新巴尔虎左旗| 岳普湖县| 延川县| 鄂尔多斯市| 武陟县| 天全县| 于都县| 兰西县| 伊春市| 静海县| 阿合奇县| 嘉峪关市| 读书| 开阳县| 芦溪县| 张家川| 武陟县| 岐山县| 手游| 定南县| 柘城县| 北京市| 阿尔山市| 长葛市| 富顺县| 文昌市| 宣汉县| 那曲县| 梁河县| 疏勒县| 麦盖提县| 云浮市| 南江县| 郑州市|