queryDSL jpa

讓JPA更升級的queryDSL - 簡化數據層操作

黃郁婷 Bernice Huang 2021/06/16 20:02:14
623

(一)前言

不可否認JPA(Java Persistence API)可以非常輕鬆透過JPA提供的基本語法輕鬆達成CRUD的操作。 但如果是針對多表的動態查詢呢?或許你要說JPA也有使用註解的@Query,在這個註解寫sql達成 你要的多表操作,但是富複雜程度不說還可讀性不佳,這些組成的拼接字串在新手眼中簡直是特異文字,就算寫好了,日後別人來維護你的程式碼還要研究老半天的sql,這時候有個好東西可以解決這個難題,直接讓你的JPA成為變形金剛。

(二)QueryDSL簡介

QueryDSL,是出於以型別安全的方式維護HQL查詢的需要而誕生的,他是個JAVA開源框架用來構造靜態型別的類似SQL的查詢,他用API代替那些複雜閱讀性不佳的拼接字符串,可跟 Hibernate 和 JPA 等框架結合使用。而且比起手打那些字串,好處有:

  • 使用開發工具IDE會自動代碼補全,不用手key
  • 幾乎沒有語法上無效的查詢
  • 可以安全地引用域類型和屬性
  • 更好地重構域類型的更改

(三)如何使用

在Maven加入依賴還有加入外掛,用來生成查詢實體

依賴

外掛

這裡說明一下 ,我們添加這個外掛是要讓程式自動生成QUERY TYPE,也就是查詢實體,命名方式會是Q+對應實體名稱ENTITY,那querydsl-apt就是為此外掛服務的。

註:

1.上圖框框即為Q類的生成對應Folder位置。

2.在程式執行過程中,如果遇到 QUERY TYPE 無法自動生成的情況(沒有對應到實體),用Maven更新一下項目即可解決(該Folder下的Lifecycle中建議先執行clean再執行compile)。

(四)實作

這裡我們直接討論多條件跨資料表查詢的操作,因為JPA對修改&刪除更直覺這邊我們先不探討,

1.首先 假設我有如下圖中的五個條件要查詢

條件DTO

2.先注入 JPAQueryFactory

依序將五個條件寫完 最後在.where()放置查詢條件

service主體

(五)小結

在這簡單的介紹queryDSL,其實目的也只是希望可以更簡單得感覺像是邊寫code邊讀懂Sql,而且在這IDE可以直接提示,不用再需要硬打出原生的Sql囉!

黃郁婷 Bernice Huang