有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通过多个可选参数筛选JPA存储库

我有一个简单的REST服务,它返回有大约20个字段的用户配置文件实体

我需要实现一个功能来过滤需要姓氏但所有其他字段(名字、年龄、城市、州、邮政编码等)都是可选的数据

有没有一种方法可以使用JpaRepository而不为每个patamenter组合创建大量if/else语句


共 (3) 个答案

  1. # 1 楼答案

    JpaRepository接口还实现了QueryByExampleExecutor接口,该接口提供了使用示例查询(QBE)技术获取数据的findAll方法。该方法将真正适用于您的场景,并且在实体有很多字段并且您希望用户能够根据其中的一些字段筛选实体时,它实际上是理想的

    假设实体是Person,您希望为获取属性等于指定属性的人员创建端点。这可以通过以下代码实现:

    实体类:

    @Entity
    public class Person implements Serializable {
        private Long id;
        private String firstName;
        private String lastName;
        private Integer age;
        private String city;
        private String state;
        private String zipCode;
    }
    

    控制器类:

    @Controller
    public class PersonController {
        private PersonService service;
        private PersonController(PersonService service) {
            this.service = service;
        }
    
        @GetMapping
        public List<Person> getMatchingPersons(@RequestBody Person personFilter) {
            return service.findMatchingPersons(personFilter);
        }
    }
    

    服务类别:

    @Service
    public class PersonService {
        private PersonRepository repository;
        private PersonService(PersonRepository repository) {
            this.repository = repository;
        }
    
        public List<Person> getMatchingPersons(Person personFilter) {
            return repository.findAll(Example.of(personFilter));
        }
    }
    

    存储库类:

    @Repository
    public class PersonRepository implements JpaRepository<Person, Long> {
    }
    
  2. # 3 楼答案

    它是JPA criteria的一个用例(从JPA2开始提供)
    实际上,当您想要编写动态查询时,首先,您不希望为每个组合硬编码JPQL查询,也不希望连接JPQL块,因为这很容易出错,并且在编译时不会检查

    请注意,在任何情况下(CriteriaJPQL),如果客户机指定了每个可能的选项,则应该检查这些选项,以便能够在查询生成中考虑它们

    现在,在实现JPARepository接口时,有两种方法:

    • 使用JpaSpecificationExecutor接口提供的List<T> findAll(@Nullable Specification<T> spec);,您也可以在自定义存储库中实现该接口

    • 使用您自己的接口丰富JPARepository,该接口定义了一个方法findAll(),并将包含研究值的对象作为参数
      然后创建一个具体的类来实现JPARepository
      这样您就能够注入EntityManager并使用CriteriaAPI