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

