保持領先
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);
}
當不僅提供標準 (firstName
) 還透過 findCustomEmployees("Alice", Sort.by("lastName"))
提供自定義排序時,Spring Data JPA 會將此自定義查詢轉化為一個完整的 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 snapshots)或 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