对所有 Spring JPA 存储库方法应用通用标准

问题描述 投票:0回答:1

我们想要实现什么?

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
类,因为它没有任何公共构造函数。

有什么办法可以做到这一点吗?

java spring spring-data-jpa
1个回答
0
投票

尝试

Optional<User> findByEmailAndDeletedAt(String email, DateTime deletedAt);

并使用

调用它
repo.findByEmailAndDeletedAtNull(email, null);
© www.soinside.com 2019 - 2024. All rights reserved.