JPA-Hibernate查询中CASE语句适配companyKey列表参数的实现方法
解决方案
不需要对列表参数做手动遍历处理,仅需调整原JPQL的匹配逻辑即可,Hibernate原生支持集合参数的IN查询,核心是将原单值等于判断改为集合包含判断。
修改后的完整代码如下:
@Query( value = "SELECT new ReportDTO(report) FROM Report report " + "JOIN report.clientFile cf " + "JOIN cf.client cl " + "WHERE report.active = TRUE " + "AND CASE WHEN report.companyKey IS NOT NULL " + "THEN report.companyKey " + "ELSE cl.companyKey " + "END IN (:companyKeys) " + "ORDER BY report.publishedDate DESC", countQuery = ".." ) @NonNull Page<TagReportDTO> findAll(@NonNull Pageable pageable, @Param("companyKeys") List<String> companyKeys);
注意事项
- 你原代码中
JOIN p.clientFile cf存在别名笔误,FROM子句中定义的Report别名是report,正确写法应为JOIN report.clientFile cf,如果原代码能正常运行可能是粘贴时的输入错误,修改时注意修正。 - 若业务场景允许传入空的companyKeys列表,需要额外补充空值判断逻辑,例如追加
OR :companyKeys IS EMPTY到WHERE条件中,避免触发数据库IN语句为空的语法错误。 - 若传入的companyKeys列表元素超过1000个,部分数据库(如Oracle)会触发IN参数数量上限报错,这种场景下建议拆分列表分批查询,或者优化业务逻辑缩小查询范围。
内容的提问来源于stack exchange,提问作者VictorGram
相关产品推荐
相关产品推荐

