SpringData JPA 使用原生 SQL


在實現個人博客系統的歸檔功能的時候,遇上這樣的需求:

  1. 先把數據庫中所有條目的時間按照年月分組,並查詢出年月(String)的列表
  2. 根據年月字符串查詢符合條件的博客,並返回博客列表

由於數據訪問層使用的SpringData JPA,所以一般是根據方法命名規則或者編寫JPQL來查詢數據庫。

但是上面兩個需求光憑方法命名應該是很難實現,寫簡單的查詢用 JPQL 還行,復雜的查詢終究是感覺不如 SQL 順暢,因此查了查在 JPA 中使用原生 SQL 的方法,總結在這里。

先上代碼:

/* @Query("select function('date_format', b.updateTime, '%Y/%m') as ym
    from Blog b group by function('date_format', b.updateTime, '%Y/%m') order by ym") */
@Query(value = "SELECT date_format(b.update_time, '%Y/%m') AS ym FROM t_blog b GROUP BY ym ORDER BY ym DESC",
        nativeQuery = true)
List<String> findGroupYearMonth();

@Query(value = "SELECT * FROM t_blog b WHERE date_format(b.update_time, '%Y/%m') = :yearmonth ORDER BY B.update_time DESC",
        nativeQuery = true)
List<Blog> findBlogsByYearAndMonth(@Param("yearmonth") String yearMonth);

主要有兩點:

  1. 想使用原生 SQL 需要在@Query里加上nativeQuery = true
  2. 給原生 SQL 傳遞參數需要在方法參數里使用@Param("name"),然后在SQL中以:name形式填充。

順便在測試的時候還發現了一個小 tip:new出來的對象中如果有需要@Autowire的成員,是不會注入成功的。要么全部使用@Autowire


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM