領先一步
VMware 提供培訓和認證,以加速您的進展。
了解更多有時候,無論您嘗試應用多少功能,Spring Data JPA 似乎都無法在查詢傳送到 EntityManager
之前,將您想要的一切都應用到查詢中。
使用 3.0.0-SNAPSHOT
(並針對 Spring Data 的下一個里程碑版本),您現在可以在查詢傳送到 EntityManager
之前立即取得查詢,並「重寫」它。 也就是說,您可以在最後一刻進行任何修改。
請查看以下範例
範例 1. 使用 @Query
宣告 QueryRewriter
public interface MyRepository extends JpaRepository<User, Long> {
@Query(value = "select original_user_alias.* from SD_USER original_user_alias",
nativeQuery = true, queryRewriter = MyQueryRewriter.class) // (1)
List<User> findByNativeQuery(String param);
@Query(value = "select original_user_alias from User original_user_alias",
queryRewriter = MyQueryRewriter.class) // (2)
List<User> findByNonNativeQuery(String param);
}
這個純 SQL 查詢(感謝 nativeQuery
)將在查詢被調用之前,透過尚未定義的 MyQueryRewriter
進行路由。
這個 JPQL 查詢也會在傳遞給 EntityManager
之前,透過相同的 MyQueryRewriter
進行路由。
然後您可以編寫自己的程式碼,如下所示!
範例 2. QueryRewriter
範例
public class MyQueryRewriter implements QueryRewriter {
@Override
public String rewrite(String query, Sort sort) {
return query.replaceAll("original_user_alias", "rewritten_user_alias");
}
}
好的,這有點牽強。 我們基本上是在更改特定查詢的別名。 但您實際上可以做任何您能想到的事情。 這個掛鉤讓您有機會更改一點(或很多!)。
請務必在應用程式上下文中註冊一個 MyQueryRewriter
實例。 無論您使用 Spring Framework 的 @Component
相關的註解,還是透過 @Configuration
類別中的 @Bean
方法提供它,都由您選擇。
警告
您的 QueryRewriter
在 Spring Data JPA 執行任何和所有檢查之後被調用。 您有責任向 EntityManager
提供有效的查詢。
等等…還有更多!
雖然您可以將 QueryRewriter
寫成一個獨立的 bean,但也可以直接放在使用它的 repository 中!
範例 3. 提供 QueryRewriter
的 Repository
public interface MyRepository extends JpaRepository<User, Long>,
QueryRewriter { // (1)
@Query(value = "select original_user_alias.* from SD_USER original_user_alias",
nativeQuery = true, queryRewriter = MyRepository.class) // (2)
List<User> findByNativeQuery(String param);
@Query(value = "select original_user_alias from User original_user_alias",
queryRewriter = MyRepository.class) // (3)
List<User> findByNonNativeQuery(String param);
@Override
default String rewrite(String query, Sort sort) { // (4)
return query.replaceAll("original_user_alias", "rewritten_user_alias");
}
}
讓您的 repository 介面擴展 QueryRewriter
介面。
將您的 repository 名稱插入 native query 的 @Query.queryRewriter
條目中。
將您的 repository 名稱插入 JPQL query 的 @Query.queryRewriter
條目中。
覆寫 rewrite(String,Sort)
方法並插入一個 default
值,然後 **POOF** 您就完成了!
公平警告:根據您正在執行的操作,您可能需要多個 rewriter。
Spring Data JPA 不僅支援 Spring 的應用程式上下文,還支援基於 CDI 的環境。
查詢愉快!
-Greg Turnquist