领先一步
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,但也可以将其直接放在使用的存储库中!
示例 3. 提供 QueryRewriter
的存储库
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");
}
}
让您的存储库接口扩展 QueryRewriter
接口。
将您的存储库名称插入到本机查询的 @Query.queryRewriter
条目中。
将您的存储库名称插入到 JPQL 查询的 @Query.queryRewriter
条目中。
覆盖 rewrite(String,Sort)
方法并插入一个 default
值,然后 **POOF** 您就完成了!
公平警告:根据您所做的事情,您可能需要多个重写器。
Spring Data JPA 不仅支持 Spring 的应用程序上下文,还支持基于 CDI 的环境。
查询愉快!
-Greg Turnquist