java - Spring Boot JPA CrudRepository 如何制作可选的搜索参数
问题描述
对于下面的类,我要向存储库添加其他搜索方法,如何在 findByFields 方法中使搜索参数可选?这种方法只有两个参数,但考虑一个有更多参数的场景。
一个示例场景是一个搜索表单页面,其中可能有 10 到 20 个搜索过滤器。用户可以使用 0 到所有搜索参数的任意组合。
有没有办法让这些字段成为可选的,如果提供了一个空值,那么该字段将不会被添加为查询过滤器?
我知道我可以在方法中添加逻辑来说明 paramA 和 paramB 是否有值,然后为该组合调用一个方法并为不同的组合调用另一个方法,但在我看来,这将是一个糟糕的解决方案。
有什么建议么?能够在不添加手动查询语句的情况下执行此操作会很好。
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface ReportMappingRepository extends CrudRepository<ReportMapping, Integer> {
public ReportMapping findReportMappingByReportId(@Param("reportID") int reportId);
public List<ReportMapping> findByFields(@Param("id")int id, @Param("reportID") int reportId);
}
解决方案
感谢 Eklavya 为我指明了正确的方向,我使用 JPA 规范解决了这个问题。
更改了存储库以扩展 JpaSpecificationExecutor。
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
public interface ReportMappingRepository extends CrudRepository<ReportMapping, Integer>, JpaSpecificationExecutor<ReportMapping> {
}
创建搜索条件和搜索操作类,然后像这样执行查询。
// Build up Search Criteria Specification
// Id
ReportMappingSpecification searchSpec = new ReportMappingSpecification();
if (queryForm.getId() != null && queryForm.getId().length() > 0) {
searchSpec.add(new SearchCriteria("id", queryForm.getId(), SearchOperation.EQUAL));
}
// reportId
if (queryForm.getReportId() != null && queryForm.getReportId().length() > 0 && !queryForm.getReportId().equalsIgnoreCase("0")) {
searchSpec.add(new SearchCriteria("reportId", queryForm.getReportId(), SearchOperation.EQUAL));
}
// Run search
reportMappingRepo.findAll(searchSpec).forEach(reportMappings::add);
希望这对其他人有帮助。
推荐阅读
- architecture - Should Frontend or Backend handles currency conversions?
- python - Django EmailMessage.content_type = 'html' keep newlines?
- java - 字符串月-年到本地日期
- r - 在 R 中的多个文件中重复相同的操作
- sql - 如何选择在过去 30 天内登录的客户,current_date - 30 在 Oracle SQL、HiveQL 中不起作用?
- sql - SQL创建不同团队之间的胜率表?
- c# - 为什么当搜索词具有“-A”后缀时,DtSearch 找不到任何匹配项?
- python - psycopg2 不使用 Python 3.8.8 连接到 Greenplum PostgreSQL DB。OperationalError:收到对 GSSAPI 协商的无效响应:
- powershell - 在 .txt 中搜索字符串的 PowerShell 脚本,如果找到,则查找包含另一个字符串的下一行并对其进行处理
- pool - Toloka 任务页面是如何创建的