gpt4 book ai didi

java - HQL 检查 @param 中传递的列表大小

转载 作者:行者123 更新时间:2023-12-04 15:50:27 26 4
gpt4 key购买 nike

有没有办法检查 util.List 的大小?例如,它是否为空?

我尝试了下面的查询,它生成了带有消息 ??? 的 QuerySyntaxException未映射

..where (:filters IS EMPTY or  (d.id in (:filters))")
List<EntityXX> getXXX(List<Integer> filters);

最佳答案

正如 dbl 在他的评论中回答的那样,无法检查作为 @Param 传递的 List<> 的大小。

您正在使用 HQL,因此由于 JPQL 查询始终是有效的 HQL 查询,我想分享我的解决方案。

@Query("SELECT p FROM Product p "
+ "LEFT JOIN p.categories category "
+ "WHERE p.name LIKE CONCAT('%', :searchRequest, '%') "
+ "AND p.description LIKE CONCAT('%', :description, '%') "
+ "AND p.price BETWEEN :priceLow AND :priceHigh "
+ "AND p.archived = :archived "
+ "AND category.name IN :selectedCategories "
+ "GROUP BY p "
+ "HAVING SIZE(p.categories) >= :amountOfSelectedCategories"

)
Page<Product> findAllBySearchModel(
Pageable pageable,
@Param("searchRequest") String searchRequest,
@Param("description") String description,
@Param("priceLow") BigDecimal priceLow,
@Param("priceHigh") BigDecimal priceHigh,
@Param("archived") boolean archived,
@Param("selectedCategories") List<String> selectedCategories,
@Param("amountOfSelectedCategories") int amountOfSelectedCategories
);

由于 WHERE ... IN 子句总是使用 OR 条件,而我想缩小搜索范围,我不得不找到另一种方法来进一步限制我的结果。

因此,我需要传入列表的大小。在 JPQL 中,您可以轻松地使用 SIZE(),除了 @Param。

这导致了一个完整的解决方法,将我的列表的大小添加为额外的@Param。我还在我的服务层中检查一个空列表。

if (!searchModel.getSelectedCategories().isEmpty()) {
return productService.findAllBySearchModel(
pageable,
searchModel.getSearchRequest(),
searchModel.getDescription(),
searchModel.getPriceLow(),
searchModel.getPriceHigh(),
searchModel.isArchivedView(),
searchModel.getSelectedCategories(),
searchModel.getSelectedCategories().size()
);
}

*注意:我的代码有点简化,不符合生产环境标准。我只是想为那些为同样的问题而苦苦挣扎的人提供一个小例子。

关于java - HQL 检查 @param 中传递的列表大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54041299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com