java 如何在Spring Data Jpa中过滤作为RequestParams传递的多个参数?

gv8xihay  于 2023-03-16  发布在  Java
关注(0)|答案(3)|浏览(141)

假设我有一个Employee类,它有多个字段,比如nameagesalarydesignationjoiningDategender等等,那么,我该如何使用这些参数进行过滤呢?(例如,如果我想有6个过滤器,那么总共可以有6!= 720个可能的组合!!!)
对于只有2、3个参数的情况,如agesalaryname;那么我可以写多个if,比如:

if(age!=null && name==null && salary==null)
{
    findByAge
}
if(age==null && name!=null && salary==null)
{
    findByName
}
if(age!=null && name!=null && salary==null)
{
    findByAgeAndName
}

在Spring Data JPA的帮助下,像这样的参数。但是如何处理更多的参数,因为组合会随着每个RequestParams而增加?

deyfvvtc

deyfvvtc1#

您要查找的是多条件查询。您可以使用非常简单的Example API
您将使用builder模式创建一个实体。Lombok可以在这一步中帮助您:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "age")
    private int age;
    // your other fields

}

然后可以调用方法:

Employee employee = Employee
    .builder()
    .name(nameValue)
    .age(ageValue)
    .build();

return repository.findAll(Example.of(employee));

您将找到一个完整的here示例。

wj8zmpe1

wj8zmpe12#

一种解决方案是使用单个方法,并通过管理查询中的空值使参数成为“可选”参数:

@Query("""
       select a from YourEntity a where
       (?1 is null or a.name = ?1)
       and (?2 is null or a.age= ?2)
       and (?3 is null or a.salary = ?3)
       and (?4 is null or a.description = ?4)
       and (?5 is null or a.joiningDate = ?5)
       and (?6 is null or a.gender = ?6)
       """)
List<YourEntity> findFiltered(String name, Integer age, Float salary, String designation, LocalDateTime joiningDate, String gender)
px9o7tmv

px9o7tmv3#

你不应该写太多的条件和/或调用函数。很难合并太多的条件。
在这种情况下,我经常写查询,将附加条件,如果参数不为空或如果指定。
下面是我的方式:

String query = "select * from table where 1=1";
Map<String,Object> params = new HashMap<>();
if(filter1!=null){
   query += " and field1 = :filter1";
   params.put("filter1",filter1);
}
if(filter2!=null){
   query += " and field2 = :filter2";
   params.put("filter2",filter2);
}
dao.execute(query,params);

条件null不是必需的,你可以修改它。如果你不想在你的函数中有很多参数,你可以创建对象/上下文/Map来保存所有的过滤器。
PS:我使用字符串是为了可读性,你应该使用StringBuilder。
对于Spring-jpa:ExampleMatcher也可以这样做。
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.matchers

相关问题