You need to enable JavaScript to run this app. Spring JPA + MySQL 如何实现多条件SELECT FROM WHERE查询
优惠活动
大模型
产品
解决方案
定价
更多

Spring JPA + MySQL 如何实现多条件SELECT FROM WHERE查询

基于方法命名规则的最简实现

你已经掌握单条件查询的实现逻辑,多等值条件查询完全遵循同一套解析规则,不需要额外写SQL,直接在Repository接口按属性顺序拼接And关键字即可:

public interface OrderRepository extends JpaRepository<Order, Long> {
    // 对应查询逻辑:匹配userId等于传入值、category等于传入值的所有订单
    List<Order> findByUserIdAndCategory(Long userId, Integer category);
}

调用时传入对应参数即可,示例:orderRepository.findByUserIdAndCategory(1L, 1),注意方法名中属性的拼接顺序要和方法传入的参数顺序一一对应,避免参数错位导致查询结果错误。
该方法的执行逻辑由Spring Data JPA框架自动解析生成对应SQL,所有筛选条件在MySQL服务端完成判断,完全不会加载全量数据到内存后做后置过滤,适配大数据量场景。

多条件场景的其他可选实现方案

当后续查询条件变复杂、方法名拼接过长时,可以选择以下两种灵活实现方式:

  • 基于@Query注解的JPQL查询:适合固定逻辑的多条件查询,直接在注解中写查询逻辑,参数通过注解绑定,避免长方法名的可读性问题
    代码示例:
    @Query("SELECT o FROM Order o WHERE o.userId = :userId AND o.category = :category")
    List<Order> getOrdersByUserAndCategory(@Param("userId") Long userId, @Param("category") Integer category);
    
  • 基于JpaSpecificationExecutor的动态条件构造:适合查询条件不固定、需要运行时动态拼接筛选逻辑的场景,不需要为固定条件写死方法,可灵活组合等值、范围、模糊匹配等各类筛选规则
    代码示例:
    // Repository接口额外继承JpaSpecificationExecutor
    public interface OrderRepository extends JpaRepository<Order, Long>, JpaSpecificationExecutor<Order> {
    }
    
    // 业务层构造查询条件
    Specification<Order> orderSpec = (root, query, criteriaBuilder) -> {
        List<Predicate> conditionList = new ArrayList<>();
        conditionList.add(criteriaBuilder.equal(root.get("userId"), 1L));
        conditionList.add(criteriaBuilder.equal(root.get("category"), 1));
        return criteriaBuilder.and(conditionList.toArray(new Predicate[0]));
    };
    // 执行查询,条件全部下推数据库
    List<Order> result = orderRepository.findAll(orderSpec);
    

注意:以上所有方案的查询逻辑都会被转化为数据库执行的SQL,不存在内存中全量加载后过滤的性能问题,和直接执行原生SQL的性能表现一致。

内容的提问来源于stack exchange,提问作者Glasnhost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.08 05:06:07