jpa 如何在Sping Boot 中基于列表创建过滤器

bis0qfac  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(171)

我必须在Spring Boot 时创建过滤器数据。从前端,我发送一个包含每个类别的选定id的列表。我需要返回基于此列表的项目。我可以这样做
服务项目:

public List<ProductModel> getProductFilter(Integer[] categories) {
        int size = categories.length;

        if(size == 1){
            return productRepository.getProductFilteredByOneCategory(Long.valueOf(categories[0]));
        }else {
            return productRepository.getProductFilteredByTwoCategory(Long.valueOf(categories[0]),Long.valueOf(categories[1]));
        }
    }
}

储存库:

@Query("SELECT c FROM ProductModel c WHERE c.categoryModel.id = :Category_id")
List<ProductModel> getProductFilteredByOneCategory(Long Category_id);

@Query("SELECT c FROM ProductModel c WHERE c.categoryModel.id = :Category_idOne OR c.categoryModel.id = :Category_idTwo")
List<ProductModel> getProductFilteredByTwoCategory(Long Category_idOne, Long Category_idTwo);

但是如果有50个这样的类别,那就没用了,有没有人能告诉我如何让它变得更好?有什么方法可以从列表中生成查询?

gcuhipw9

gcuhipw91#

您可以使用in而不是使用多个or操作,如下所示。它选择与列表中任何categoryModel id匹配的所有productModel。

@Query("SELECT c FROM ProductModel c WHERE c.categoryModel.id in category_ids")
List<ProductModel> getProductFilteredByCategoryIds(List<Long> Category_ids);
to94eoyn

to94eoyn2#

正如@YJR所说,IN子句是解决方案,但是您还应该考虑声明如下所示的查询方法,它不需要编写JPQL。

public List<ProductModel> findByCategoryModel_IdIn(List<Long> categoryIds);

相关问题