領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多Spring Data JPA 的一個便捷功能是允許您透過其 @Query 註解插入自定義 JPA 查詢。
這允許一定的靈活性,因為您仍然可以嚮應用程式的消費者提供排序引數。請檢視下面的示例
interface SampleRepository extends CrudRepository<Employee, Long> {
@Query("select e from Employee e where e.firstName = :firstName")
List<Employee> findCustomEmployees(String firstName, Sort sort);
}
當 Spring Data JPA 收到一個帶有條件(firstName)和自定義排序(透過 findCustomEmployees("Alice", Sort.by("lastName")))的自定義查詢時,它會將其轉換為一個完整的 JPA 查詢,如下所示:
select e
from Employee e
where e.firstName = :firstName
order by e.lastName
除此之外,Spring Data JPA 還支援分頁,這需要能夠統計結果集。
過去,隨著查詢變得越來越複雜,我們“做正確的事情”並應用能夠正確指向主 SELECT 子句別名值的“order by”子句的能力,至少可以說一直充滿挑戰。
用一個適當的 count() 函式來封裝投影也很棘手。想象一下,當存在子查詢、case 語句和其他深度查詢時這樣做!
我們很高興地宣佈 HQL 和 JPQL 解析器都已釋出,這將使您在 Spring Data JPA 應用程式中自定義查詢變得更加容易。
我們結合 JPA 和 Hibernate 規範,開發了基於 ANTLR 的查詢解析引擎,並利用它們更準確地應用所需的定製,以更好地為您服務。
我們不僅可以找到放置 count() 函式的“正確位置”,還可以獲取主 FROM 表示式的別名,甚至可以檢測語義情況。
有了查詢解析器,更容易發現有效和無效查詢。有時,我們花費更多的時間來確定一個查詢是否正確,然後才弄清楚如何正確處理它。
好訊息是……它會自動應用。
當使用 @Query 註解時,有一個關鍵引數:isNative。這個布林標誌讓您可以表明您正在編寫的是原生 SQL(isNative=true)還是 JPA 查詢(預設為 isNative=false)。
如果您有一個 JPA 查詢(isNative=false)並且 Hibernate 在類路徑中,它將使用我們新的 HQL 解析器。如果 Hibernate 不在類路徑中,它將回退到功能有限的 JPQL 解析器。(受限於規範,而非我們的實現。)
因此,您只需獲取 Spring Data 釋出列車的最新快照版本(Spring Data 3.1 快照)或獲取 Spring Boot 的下一個里程碑版本即可。
還有更多功能待新增。例如,可能存在更復雜的別名,例如:
select AVG(e.timeToCloseTickets) as avg
from Employee e
當您應用 Sort.by("avg") 時,這種型別的查詢不應該產生 order by e.avg,而應該僅僅是 order by avg。我們正在研究新增對其他場景的支援。但是有了這些查詢解析器,支援這些情況變得容易得多。
我們還有一個與查詢解析相關的積壓工單,現在可以著手處理了。
作為一個額外福利,如果您想預先檢查我們自己的自定義查詢,今天的工具可以一窺究竟。
如果您使用 IntelliJ IDEA,有一個 ANTLR 外掛 (https://plugins.jetbrains.com/plugin/7358-antlr-v4) 安裝後,可以執行任何 ANTLR 語法檔案並進行測試。
src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4。
(我們最近請人們提交他們最瘋狂的 JPA 查詢,這是其中之一。乍一看,該查詢是有效的,您甚至可以放大檢視更多內容。)
祝好,--Greg Turnquist