You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JPA Repository中组合And/Or条件构建查询(不使用@Query)

可以实现,无需使用@Query注解

有两种常用方式来构建这种带分组And/Or的查询:

1. 方法命名查询

Spring Data JPA支持通过符合约定的方法名自动生成查询语句。要实现id = ? and (name like ? or last_name like ?)的逻辑,可以在方法名中用括号包裹OR条件部分,明确分组关系:

public interface UserRepository extends JpaRepository<User, Long> {
    // 括号用于分组OR条件,确保逻辑优先级
    List<User> findByIdAnd(NameLikeOrLastNameLike)(Long id, String namePattern, String lastNamePattern);
}

调用时传入参数即可:

// like查询需根据需求添加通配符%
List<User> result = userRepository.findByIdAnd(NameLikeOrLastNameLike)(5L, "%Joe%", "%Rose%");

注:部分JPA实现对带括号的方法名支持可能存在差异,如果遇到兼容性问题,推荐使用下面的Specification方式。

2. Specification动态查询

通过Specification接口可以灵活构建复杂的组合查询,完全不需要编写SQL或JPQL,也不用依赖方法命名规则:

首先让Repository继承JpaSpecificationExecutor:

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}

然后构建查询条件:

// 构建查询规格
Specification<User> userSpec = (root, query, criteriaBuilder) -> {
    // 构建id相等条件
    Predicate idEq = criteriaBuilder.equal(root.get("id"), 5);
    // 构建name模糊匹配条件
    Predicate nameLike = criteriaBuilder.like(root.get("name"), "%Joe%");
    // 构建last_name模糊匹配条件
    Predicate lastNameLike = criteriaBuilder.like(root.get("lastName"), "%Rose%");
    // 将两个like条件用OR组合
    Predicate orConditions = criteriaBuilder.or(nameLike, lastNameLike);
    // 最终组合id条件和OR分组条件
    return criteriaBuilder.and(idEq, orConditions);
};

// 执行查询
List<User> users = userRepository.findAll(userSpec);

这种方式更适合复杂的查询场景,逻辑清晰且扩展性强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:45:04