带有JPA存储库的通配符字段QueryByExample

时间:2017-12-09 13:57:35

标签: java spring spring-data-jpa jpql

我有以下JPA存储库:

public interface PostRepository extends JpaRepository<Post, String> {

    List<Post> findAll();

    List<Post> findByExample(Example<Post> example);
}

我需要修改find​​ByExample以获取示例,但在单个字段上使用通配符。所以在这种情况下,字段&#34;标题&#34;需要等同于SQL&#39;喜欢&#39;或者&#39;包含&#39;。

Spring文档显示了这一点:

Person person = new Person();                          
person.setFirstname("Dave");                           

ExampleMatcher matcher = ExampleMatcher.matching()     
  .withIgnorePaths("lastname")                         
  .withIncludeNullValues()                             
  .withStringMatcherEnding();                          

Example<Person> example = Example.of(person, matcher);

来自https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods

但我不确定如何自定义我的界面(假设使用默认方法)来使用它。

或者是否有一个方法的特定名称,spring将使用此功能自动配置,例如

List<Post> findByExampleTitleLike(Example<Post> example);

TIA

2 个答案:

答案 0 :(得分:1)

我这样做:

Person person = ...
PageRequest page = ...
ExampleMatcher matcher = ExampleMatcher.matching().withMatcher(
                               "lastname", 
                               ExampleMatcher.GenericPropertyMatcher.of(ExampleMatcher.StringMatcher.CONTAINING).ignoreCase()
                         );
return personRepository.findByExample(Example.of(person, matcher), page).getContent();

SQL'like'或'contains'StringMatcher.CONTAINING完成。另外,我添加ignoreCase()来区分大小写。

如果有人知道更短的语法,我很乐意看到:)

答案 1 :(得分:0)

替代语法(简称)。

服务方法:

{
"dll": {
        "_id": "5bde21f068a6d80712e67fab",
        "name": null,
        "dllFile": "uploads\\1541541269220msdia80.dll"
    }
}

存储库:

public Page<PersonDto> listPersons(Person probe, Pageable pageable) {
    ExampleMatcher matcher = ExampleMatcher.matching()
        .withIgnoreCase()
        .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING);

    final Example<Person> example = Example.of(probe, matcher);
    return personRepository.findAll(example, pageable)
            .map(PersonMapper::convertToDto);
}