在我当前的项目设置中,我将存储库定义为:
public interface CustomerRepository extends JpaRepository<Customer, Long>, QueryDslPredicateExecutor<Customer> {
}
QueryDslPredicateExecutor
提供了额外的findAll
方法,例如返回Iterable
。例如,它 * 不 * 包含仅指定OrderSpecifier
的方法。
我刚刚遇到了QueryDslJpaRepository
,它包含了这些Predicate
和OrderSpecifier
感知方法的更多变体,并且还返回了List
s而不是Iterable
s。
我想知道为什么QueryDslPredicateExecutor
是有限的,如果有可能使用QueryDslJpaRepository
的方法?
3条答案
按热度按时间pobjuy321#
我已经使用了一个自定义的BaseRepository,因此很容易确保我的存储库使用
List
变体(而不是Iterable
),使用:请注意,我对
QueryDslPredicateExecutor
中缺少的方法的评论是不正确的。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”。
de90aj5v3#
检查服务中的 predicate 导入,对于我的情况,这是因为自动导入带来了
import java.util.function.Predicate;
而不是import com.querydsl.core.types.Predicate;
。这会造成混乱,就像带有 predicate 函数的findall会产生错误一样。