如何使用JPA编写带参数比较条件的查询,无需借助Specification?
问题解答
可以实现,不需要借助Specification,用JPA原生的派生查询或者@Query注解即可满足需求
方案1:使用JPA派生查询(无需手写SQL/JPQL)
JPA内置支持Top/First(限制返回条数)、OrderBy(排序)关键字,直接在Repository层定义如下方法即可:
// 按category.reqName筛选后,按price倒序排序,取第一条即price最大的记录 Banner findFirstByCategoryReqNameOrderByPriceDesc(String reqName);
调用示例:
Banner maxPriceBanner = bannerRepository.findFirstByCategoryReqNameOrderByPriceDesc("First"); System.out.println(maxPriceBanner.getText());
方案2:使用@Query注解自定义JPQL(适合方法名过长的场景)
如果觉得派生查询的方法名太长可读性差,可以手写JPQL实现:
import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; // 自定义JPQL查询,逻辑和派生查询一致 @Query("SELECT b FROM Banner b WHERE b.category.reqName = :reqName ORDER BY b.price DESC LIMIT 1") Banner findMaxPriceBannerByCategoryReqName(@Param("reqName") String reqName);
注意事项:
- 如果你的JPA实现版本不支持在JPQL中写
LIMIT,可以换回方案1的派生查询,兼容性更好 - 若同分类下存在多条
Price相同且均为最大值的记录,以上方法只会返回其中一条,若需要固定返回规则,可以额外增加排序字段,比如按创建时间倒序:findFirstByCategoryReqNameOrderByPriceDescCreateTimeDesc
内容的提问来源于stack exchange,提问作者Saintka
相关产品推荐
相关产品推荐

