当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Data Jpa中过滤多个参数作为请求参数传递?

谭志用
2023-03-14

假设我有一个Employee类,有多个字段,比如姓名年龄薪水职务加入日期性别,等等。现在,我如何应用过滤和许多这样的参数?在这种情况下,可能有许多组合。(例如,如果我想要6个过滤器,那么总共可以有6个!=720个组合!!!)

只有2、3个参数,比如年龄薪水姓名;然后我可以写多个例子,比如:

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

等。但是如何处理更多的参数,因为组合会随着每个请求参数的增加而增加?

共有3个答案

钦景胜
2023-03-14

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

@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)
向杜吟
2023-03-14

你不应该写很多条件和/或调用函数。很难将多种情况结合起来。

在这种情况下,我经常编写一个查询,如果参数不为null或指定,它将附加条件。

这是我的方式:

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不是必需的,您可以调整它。以防你不想在函数中有很多参数。您可以创建对象/上下文/映射来保存所有过滤器。

PS:为了可读性,我使用字符串,你应该使用StringBuilder。

对于spring jpa:ExampleMatcher也可以这样做。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-举个例子。匹配器

萧晓博
2023-03-14

您需要的是多条件查询。您可以使用非常简单的示例API

在你的例子中,代码应该是这样的:

您将创建一个具有构建器模式的实体。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));

你会在这里找到一个完整的例子。

 类似资料:
  • 直接打印axios的请求拦截的config时是包含那些值为undefined的参数的,但是在浏览器和服务端中却没有了,请问这是哪个环节的问题?应该如何避免这种情况? 打印config的时候params是包含latitude和longitude的 Chrome网络中却不包含这两个参数

  • 问题内容: 我试图弄清楚如何在URL中传递多个参数。我想将纬度和经度从我的android类传递给Java servlet。我怎样才能做到这一点? 在这种情况下,输出(写入文件)为。这是可行的,但我想在两个单独的参数中传递纬度和经度,以便减少在服务器端的工作。如果不可能,我如何至少在&之间添加一个空格,以便可以使用class获取经度和纬度。我试过以下行,但无济于事。 我的servlet代码如下: 我

  • 本文向大家介绍在 mapper 中如何传递多个参数?相关面试题,主要包含被问及在 mapper 中如何传递多个参数?时的应答技巧和注意事项,需要的朋友参考一下 1、第一种:   2、第二种:使用 \@param 注解:   然后,就可以在 xml 像下面这样使用(推荐封装为一个 map,作为单个参数传递给mapper)   3、第三种:多个参数封装成 map

  • 假设我有一个Employee类。它有很多字段,比如id、名字、姓氏、姓名、年龄、薪水和其他字段。现在,我正在进行一个Get查询,希望使用所有这些字段(required=false)作为请求参数传递。 但问题是,可能有许多组合,如(firstName, age)或(age,工资,lastName)或(指定,年龄,工资,lastName)等等。那么我应该如何处理所有这些筛选器。我必须为每个案例编写每个

  • 我想通过Spring过滤器或方面记录超文本传输协议请求中的请求参数。我尝试了不同的方法,但请求参数为空或未调用方法。我使用的是POSTMAN,它是一个POST请求。 http://localhost:8080/available data 请求正文示例: {“keyUserAgent”:“CFNetwork/1209 Darwin/20.2.0”,“locale”:“en_US”,“eid”:“8

  • 我有一个JSON数据文件 首先,我想读取这个数据,当wheels.value==Yes时,我想点击一个API,否则点击另一个API,我想知道如何在post请求中或从文件中传递多个参数。 Post请求数据如下: 上面的数据我正在邮递员中传递“表单-数据”。 提前致谢