在我目前的项目设置中,我将存储库定义为:
public interface CustomerRepository extends JpaRepository<Customer, Long>, QueryDslPredicateExecutor<Customer> {
}
QueryDslPredicateExecutor
提供额外的findAll
方法,例如Iterable
。
它例如不是否包含仅指定OrderSpecifier
的方法。
我刚遇到QueryDslJpaRepository
,其中包含这些Predicate
和OrderSpecifier
感知方法的更多变体,并且还返回List
而不是Iterable
s
我想知道为什么QueryDslPredicateExecutor
有限并且是否可以使用QueryDslJpaRepository
方法?
答案 0 :(得分:4)
我已经使用了自定义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
中查询遗漏方法的常见错误。
答案 1 :(得分:3)
QueryDslJpaRepository扩展了SimpleJpaRepository
当你想要adding custom behavior to all repositories时使用SimpleJpaRepository。这需要三个步骤:
步骤1:创建扩展JpaRepository的接口(例如CustomRepository),然后添加自己的接口方法
步骤2:创建一个实现CustomRepository的类(例如CustomRepositoryImpl),这自然要求您为不仅在CustomRepository中定义的每个方法以及JpaRepository以及JpaRepository的祖先接口定义的每个方法提供具体的方法实现。这是一项繁琐的工作,所以Spring提供了一个SimpleJpaRepository具体类来为你做这件事。因此,您需要做的就是使CustomRepositoryImpl扩展SimpleJpaRepository,然后只为您自己的CustomRepository接口中的方法编写具体方法。
步骤3:使CustomRepositoryImpl成为jpa配置中的新基类(在xml或JavaConfig中)
同样,当CustomRepository不仅扩展JpaRepository而且还扩展QueryDslPredicateExecutor接口时,QueryDslJpaRepository是SimpleJpaRepository的替代品,可以为您的存储库添加QueryDsl支持。
我希望Spring Data JPA文档明确了如果有人使用QueryDslPredicateExecutor但又想添加他/她自己的自定义方法该怎么做。我花了一些时间来弄清楚当应用程序抛出错误时要做什么,例如“找不到类型xxx的属性findAll”或“找不到类型xxx的属性”。