如何编写一个findByCritera1InAndCritera2In使用(spring数据)CrudRepository,参数是可选的

时间:2016-08-18 16:56:03

标签: spring spring-boot spring-data-jpa crud

我使用Spring引导弹簧数据,特别是扩展CrudRepository的PagingAndSortingRepository类。
我需要一个返回表的所有条目的查询,如果匹配四个列表中的任何一个,当它为null(或为空)时忽略它。
如果我使用findByTypeInAndLocaleInAndCategoryInAndTagIn并且其中一个列表为空,则结果也为空。所以我最终写了几个查找器,并根据哪个列表是空的使用不同的。
是否可以将其组合在一个探测器中?

所以,例如如果我使用findByTypeAndLocale,如果列表类型为空,我想匹配所有类型的值。

对任何提示感到高兴。

@Repository
public interface FeedRepository extends PagingAndSortingRepository<FeedEntry, Long>, JpaSpecificationExecutor<FeedEntry> {
    public List<FeedEntry> findByGuid(String guid);
    public Page<FeedEntry> findAll(Pageable pageable);
    public Page<FeedEntry> findByLocale(List<LocaleEnum> type, Pageable pageable);
    public Page<FeedEntry> findByType(List<FeedTypeEnum> type, Pageable pageable);
    public Page<FeedEntry> findByTypeAndLocale(FeedTypeEnum type, LocaleEnum locale, Pageable pageable);    
    public Page<FeedEntry> findByTypeInAndLocaleIn(List<FeedTypeEnum> type,List<LocaleEnum> locale, Pageable pageable);
    public Page<FeedEntry> findByTypeInAndLocaleInAndCategoryIn(List<FeedTypeEnum> type,List<LocaleEnum> locale, List<String> category, Pageable pageable);
    public Page<FeedEntry> findByTypeInAndLocaleInAndTagIn(List<FeedTypeEnum> type,List<LocaleEnum> locale, List<String> tag, Pageable pageable);
    public Page<FeedEntry> findByTypeInAndLocaleInAndCategoryInAndTagIn(List<FeedTypeEnum> type,List<LocaleEnum> locale, List<String> category, List<String> tag, Pageable pageable);      
} 

2 个答案:

答案 0 :(得分:1)

你无法做到这一点。如果列表为空,则表示没有任何与您的条件查询匹配的值。

要执行您要查找的内容,您需要使用与QBE

兼容的Query By exampleCrudRepository)来执行此操作

为什么呢?你需要一个动态查询,正如文档所说:

  

按示例查询(QBE)是一种用户友好的查询技术   简单的界面。它允许动态查询创建,但不允许   要求编写包含字段名称的查询。实际上,查询依据   示例不需要使用特定于商店的查询来编写查询   完全是语言。

doc的一个例子:

public interface PersonRepository extends JpaRepository<Person, String> { … }

public class PersonService {

  @Autowired PersonRepository personRepository;

  public List<Person> findPeople(Person probe) {
    return personRepository.findAll(Example.of(probe));
  }

}

**为你的案例做例子......

答案 1 :(得分:1)

我担心此刻不可能。

恕我直言,实现目标的最佳方法是使用Spring Data JPA规范(http://docs.spring.io/spring-data/jpa/docs/1.10.2.RELEASE/reference/html/#specifications)并手动检查每个参数是否为空值...