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
相关产品推荐
相关产品推荐

