[英]How to pass multiple query parameters in @Query in Spring Data JPA?
[英]How to have filtering of multiple parameters passed as RequestParams in Spring Data Jpa?
假设我有一个 Employee 类,其中包含多个字段,如姓名、年龄、薪水、职位、加入日期、性别等等。 现在,我如何使用许多这样的参数应用过滤? 在这种情况下可能有多种组合。 (例如,如果我想要 6 个过滤器,那么总共可以有 6 个!= 720 种可能的组合!!!)
仅适用于 2,3 个参数,如年龄、薪水、姓名; 那么我可以写多个 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 的组合都会增加?
您正在寻找的是多条件查询。 您可以使用非常简单的示例 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));
你会 在这里找到一个完整的例子。
你不应该写很多条件和/或调用函数。 许多条件很难结合起来。
在这种情况下,我经常编写查询,如果参数不为空或指定,则该查询将附加条件。
这是我的方法:
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:我使用 String 来提高可读性,你应该使用 StringBuilder。
对于 spring-jpa:ExampleMatcher 可以做同样的事情。
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example.matchers
一种解决方案是使用单一方法,并通过管理查询中的空值使参数“可选”:
@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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.