【问题标题】:Use cases of methods of QueryByExampleExecutor<T> interface in Spring data JPASpring data JPA中QueryByExampleExecutor<T>接口的方法用例
【发布时间】:2016-10-03 01:13:20
【问题描述】:

这个接口QueryByExampleExecutor&lt;T&gt;的方法在Spring data JPA中有哪些用例。我用谷歌搜索,只找到官方文档。

也许有人可以通过示例为我指出正确的资源。

特别是,该界面的findAll(Example&lt;S&gt; example, Pagable pageable) 是一种更简单的搜索、分页和排序方式吗?

【问题讨论】:

    标签: java spring spring-data spring-data-jpa query-by-example


    【解决方案1】:

    Spring Data JPA 示例查询技术使用Examples 和ExampleMatchers 将实体实例转换为基础查询。 current official documentation 有几个有用的例子。这是我受文档启发的示例:

    Person.java

    public class Person {
    
      @Id
      private String id;
      private String firstname;
      private String lastname;
      private Address address;
    
      // … getters and setters omitted
    }
    

    PersonResource.java

    @RestController
    @RequestMapping("/api")
    public class PersonResource {
    
    @GetMapping("/persons/{name}")
    @Timed
    public ResponseEntity<List<Person>> getPersons(@ApiParam Pageable pageable, @PathVariable String  name) {
        log.debug("REST request to get Person by : {}", name);
        Person person = new Person();                         
        person.setFirstname(name);  
        Page<Person> page = personRepository.findAll(Example.of(person), pageable);
        HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/persons");
        return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
    }
    

    【讨论】:

    • 那么为什么我们需要将Example.of(person) 而不是人传递给findAll()。你能解释一下ExamplesExampleMatcher存在的原因吗?
    • 因为 QueryByExampleExecutor 有这个 API。您有机会阅读官方文档中的链接吗?
    【解决方案2】:

    来自Example 的 Spring 文档:

    支持示例查询 (QBE)。一个示例需要一个探针来定义示例。可以使用 ExampleMatcher 调整匹配选项和类型安全性。

    所以这个类和QueryByExampleExecutor 接口是 Spring Data 实现这个 Query By Example 范式的一部分。

    来自Query by Example 上的维基百科帖子:

    Query by Example (QBE) 是一种用于关系数据库的数据库查询语言。它是由 IBM Research 的 Moshé M. Zloof 在 1970 年代中期与 SQL 的开发同时设计的。它是第一个图形查询语言,使用可视表格,用户可以在其中输入命令、示例元素和条件。

    最后,您引用的 #findAll 方法的文档说明如下:

    &lt;S extends T&gt; Page&lt;S&gt; findAll(Example&lt;S&gt; example, Pageable pageable)
    返回与给定Example 匹配的实体Page。如果找不到匹配项,则返回一个空的Page

    所以本质上,QBE 代表了一种使用更自然的、基于模板的查询语法来查询关系数据库的方法,而不是使用 SQL,并且 Spring Data 有一个支持它的 API。

    【讨论】:

    • 所以可以肯定地说findAll(Example&lt;S&gt; example, Pageable pageable中的example参数可以提供某种过滤。我还没有看到这方面的教程或示例。为 Wikipedia 链接 +1。
    • @wiseOne 是的,这是一种过滤方式。 Wikipedia 链接有一个 DB 示例,但如果您单击按示例查询 StackOverflow 标记,也会有一些 Spring 示例。
    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2021-02-24
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2016-06-20
    • 2015-02-13
    • 2015-12-23
    相关资源
    最近更新 更多