spring-data-jpa 如何使用QueryDslJpaRepository?

fcipmucu  于 2022-11-10  发布在  Spring
关注(0)|答案(3)|浏览(240)

在我当前的项目设置中,我将存储库定义为:

public interface CustomerRepository extends JpaRepository<Customer, Long>, QueryDslPredicateExecutor<Customer> {
}

QueryDslPredicateExecutor提供了额外的findAll方法,例如返回Iterable。例如,它 * 不 * 包含仅指定OrderSpecifier的方法。
我刚刚遇到了QueryDslJpaRepository,它包含了这些PredicateOrderSpecifier感知方法的更多变体,并且还返回了List s而不是Iterable s。
我想知道为什么QueryDslPredicateExecutor是有限的,如果有可能使用QueryDslJpaRepository的方法?

pobjuy32

pobjuy321#

我已经使用了一个自定义的BaseRepository,因此很容易确保我的存储库使用List变体(而不是Iterable),使用:

@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID>, QueryDslPredicateExecutor<T> {

    @Override
    List<T> findAll(Predicate predicate);

    @Override
    List<T> findAll(Predicate predicate, Sort sort);

    @Override
    List<T> findAll(Predicate predicate, OrderSpecifier<?>... orders);

    @Override
    List<T> findAll(OrderSpecifier<?>... orders);
}

请注意,我对QueryDslPredicateExecutor中缺少的方法的评论是不正确的。

sf6xfgos

sf6xfgos2#

QueryDslJpaRepository扩展了简单JpaRepository
SimpleJpaRepository用于向所有存储库添加自定义行为。
第1步:创建一个扩展JpaRepository的接口(例如CustomRepository),然后添加您自己的接口方法
第二步:创建类(例如CustomRepositoryImpl),它实现了您的CustomRepository,这自然要求您为CustomRepository、JpaRepository以及JpaRepository的祖先接口中定义的每个方法提供具体的方法实现。因此Spring提供了一个SimpleJpaRepository具体类来为您完成这项工作。因此,您所需要做的就是使CustomRepositoryImpl扩展SimpleJpaRepository,然后只在您自己的CustomRepository接口中为该方法编写具体的方法。
第3步:使CustomRepositoryImpl成为jpa配置中的新基类(在xml或JavaConfig中)
类似地,当CustomRepository不仅扩展JpaRepository而且扩展QueryDslPredicateExecutor接口以向存储库添加QueryDsl支持时,QueryDslJpaRepository是SimpleJpaRepository的直接替代。
我希望Spring Data JPA文档能够清楚地说明如果有人正在使用QueryDslPredicateExecutor,但还想添加他/她自己的自定义方法时该怎么做。我花了一些时间才弄清楚当应用程序抛出错误时该怎么做,例如“No property findAll found for type xxx”或“No property exists found for type xxx”。

de90aj5v

de90aj5v3#

检查服务中的 predicate 导入,对于我的情况,这是因为自动导入带来了import java.util.function.Predicate;而不是import com.querydsl.core.types.Predicate;。这会造成混乱,就像带有 predicate 函数的findall会产生错误一样。

相关问题