
本文介绍如何在 Spring Data JPA 中不使用 @Query 注解,仅通过方法命名规则构建含 AND 和 OR 组合逻辑的查询(如 WHERE id = ? AND (name LIKE ? OR last_name LIKE ?))。
本文介绍如何在 spring data jpa 中不使用 @query 注解,仅通过方法命名规则构建含 and 和 or 组合逻辑的查询(如 `where id = ? and (name like ? or last_name like ?)`)。
在 Spring Data JPA 中,Repository 接口支持基于方法名的查询派生(query derivation)机制,可自动解析 And、Or、Containing 等关键词生成对应 JPQL。但需注意:JPA 命名查询默认按从左到右顺序组合,且不支持括号分组语义——这意味着 findByNameContainingOrLastNameContainingAndId() 实际生成的逻辑是 (name LIKE ? OR last_name LIKE ?) AND id = ?,恰好等价于目标 SQL 的语义(因 AND 优先级高于 OR,在布尔逻辑中该表达式天然满足结合性要求)。
✅ 正确写法如下(推荐):
public interface UserRepository extends JpaRepository<user long> {
// 生成 JPQL: WHERE (name LIKE %?% OR last_name LIKE %?%) AND id = ?
List<user> findByNameContainingOrLastNameContainingAndId(String name, String lastName, Long id);
}</user></user>
⚠️ 注意事项:
- 参数顺序必须严格匹配方法名中条件出现的顺序:
name→lastName→id; -
Containing对应LIKE %?%(大小写不敏感),若需精确匹配,改用Equals;若需前缀匹配,用StartingWith; - 方法名中的
And/Or是连接词,不区分大小写但必须首字母大写(如andId合法,andid无效); - 若逻辑复杂(如嵌套多层括号、NOT 条件或聚合函数),命名方式将难以表达,此时应改用
@Query或Criteria API。
? 小技巧:可通过启用 logging.level.org.springframework.orm.jpa=DEBUG 查看实际生成的 JPQL,验证逻辑是否符合预期。
总结:对于 AND + (OR) 这类常见组合,合理利用 And/Or/Containing 等关键字即可零注解实现;关键在于理解命名规则的隐式优先级,并通过日志验证生成语句,确保业务逻辑准确无误。










