Spring Data JPA 自定义查询通过接口声明+自动解析实现,支持命名规则(如 findByEmail)、@Query 注解(JPQL/原生SQL)和 Example 查询,需注意字段名大小写、返回类型匹配及事务管理。

在 Spring Data JPA 中,Repository 接口的自定义查询方法不是靠手动写实现类,而是通过接口声明 + 框架自动解析来完成的。核心在于:你只定义方法签名,Spring 在运行时根据命名规则或注解生成对应 SQL/JPQL 查询逻辑。
用方法命名规则定义查询
这是最常用、最轻量的方式。只要方法名符合 Spring Data 的关键词约定,框架就能自动翻译成查询语句。
- 前缀可选:
find、read、query、count、get(如findByEmail和readByEmail效果一样) - 条件连接词:
And、Or、Between、Like、IgnoreCase、IsNull等(注意首字母大写) - 参数顺序必须和关键字顺序一致。例如:
List<User> findByNameAndAge(String name, Integer age)→ WHERE name = ? AND age = ? - 支持分页和排序:在方法参数末尾加
Pageable pageable或Sort sort,返回类型用Page<User>或Iterable<User>
用 @Query 注解写定制化查询
当命名规则无法满足复杂逻辑(比如多表 JOIN、聚合函数、动态条件),就用 @Query 显式写 JPQL 或原生 SQL。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
@Query(value = "SELECT * FROM user WHERE name LIKE %:keyword%", nativeQuery = true):写原生 SQL,nativeQuery = true -
@Query("SELECT u FROM User u WHERE u.email LIKE %:domain%"):写 JPQL(面向实体,非表),nativeQuery = false(默认) - 参数绑定用
:paramName(需配合@Param("paramName"))或位置参数?1、?2 - 修改操作(UPDATE/DELETE)必须加
@Modifying,且所在方法需在事务内执行(通常加@Transactional)
用 Example 查询(Query by Example)
适合字段不确定、前端传参不固定场景,比如通用搜索框。它基于一个“样例对象”做模糊匹配。
立即学习“Java免费学习笔记(深入)”;
- Repository 需继承
JpaRepository(已自带QueryByExampleExecutor) - 构造
ExampleMatcher控制匹配策略(忽略空值、字符串模糊、大小写等) - 调用
repository.findAll(Example.of(user, matcher), pageable)即可获得分页结果
注意事项与常见陷阱
这些细节容易导致启动失败或查不到数据:
- 实体类字段名必须和方法中关键词严格一致(大小写敏感),比如
userName就不能写成username - 方法返回类型要匹配:单条用
User或Optional<User>;列表用List<User>;分页用Page<User> - 默认查询策略是
CREATE_IF_NOT_FOUND:先找@Query,找不到再按名字解析。一般不用改 - 接口必须被
@Repository标记(或被扫描到),且泛型参数要写对:UserRepository extends JpaRepository<User, Long>

















