Spring Data JPA 让我们可以像这样定义存储库方法:
Optional<User> findByEmail(String email);
这样,将通过方法名称找出要运行的查询。在这种情况下,类似于
select * from user where email = ?
。
我们希望对存储库中的所有此类
find...By
方法应用一个额外的通用标准,即and deleted_at is null
条件。
本质上,
findByEmail
应该表现得像findByEmailAndDeletedAtNull
。
我们过去常常通过扩展
ReactivePartTreeMongoQuery
并使用类似以下内容覆盖 createQuery
来使用响应式 Spring Data MongoDB 来实现此目的:
@Override
protected Mono<Query> createQuery(ConvertingParameterAccessor accessor) {
return super.createQuery(accessor).map(query -> {
query.addCriteria(where("deletedAt").is(null));
return query;
});
}
这效果很好。我们现在转向使用 RDBMS 并寻找类似的行为。
我发现
PartTreeJpaQuery.QueryPreparer.createQuery()
是从 EntityManager.createQuery
对象调用 CriteriaQuery
并返回 TypedQuery
对象的那个。
我设法挂钩到这个中间,但无法向
TypedQuery
对象添加额外的条件,就像我可以使用 CriteriaQuery
一样。并且无法访问 QueryPreparer
对象来挂钩它。
我也无法扩展
PartTreeJpaQuery
类,因为它没有任何公共构造函数。
有什么办法可以做到这一点吗?
尝试
Optional<User> findByEmailAndDeletedAt(String email, DateTime deletedAt);
并使用
调用它repo.findByEmailAndDeletedAtNull(email, null);