如何使用QueryDslJpaRepository?

时间:2015-03-18 08:12:40

标签: spring-data spring-data-jpa querydsl

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

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

QueryDslPredicateExecutor提供额外的findAll方法,例如Iterable。 它例如是否包含仅指定OrderSpecifier的方法。

我刚遇到QueryDslJpaRepository,其中包含这些PredicateOrderSpecifier感知方法的更多变体,并且还返回List而不是Iterable s

我想知道为什么QueryDslPredicateExecutor有限并且是否可以使用QueryDslJpaRepository方法?

2 个答案:

答案 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的属性”。