Spring Data 仓库与查询方法
扩展 JpaRepository,按照命名约定定义查询方法,并使用 @Query 编写自定义 JPQL
Spring Data 仓库与查询方法 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
Spring Data JPA 仓库
扩展 JpaRepository<Entity, ID>,即可免费获得增删改查、分页和排序方法。Spring 会在启动时生成实现,无需编写 SQL 或 DAO 样板代码。
public interface UserRepository extends JpaRepository<User, Long> {
// Free: findAll, findById, save, delete, count, existsById, etc.
}派生查询方法
Spring Data 会根据方法名生成查询。命名约定为:findBy + 属性 + 可选条件。
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByStatus(UserStatus status);
Optional<User> findByEmail(String email);
List<User> findByAgeGreaterThanAndStatusOrderByNameAsc(int age, UserStatus s);
boolean existsByEmail(String email);
long countByStatus(UserStatus status);
}方法名支持的关键字
主要命名关键字包括:And、Or、Is/Equals、Between、LessThan/GreaterThan、Like/NotLike、In/NotIn、IsNull/IsNotNull、OrderBy、First/Top。
List<User> findTop5ByStatusOrderByCreatedAtDesc(UserStatus s);
List<User> findByNameContainingIgnoreCase(String fragment);
List<User> findByCreatedAtBetween(LocalDateTime from, LocalDateTime to);使用 @Query 编写自定义 JPQL
对于无法通过方法名表达的复杂查询,请使用 @Query。JPQL 使用实体类名和字段名,而不是表名或列名。
@Query("SELECT u FROM User u WHERE u.email = :email AND u.status = :status")
Optional<User> findActiveByEmail(@Param("email") String email,
@Param("status") UserStatus status);
@Query("SELECT u.name, COUNT(o) FROM User u JOIN u.orders o GROUP BY u.name")
List<Object[]> countOrdersPerUser();原生查询
使用 nativeQuery = true 编写原始数据库查询语句。这对于 ON CONFLICT、窗口函数或全文搜索等数据库特有功能很有用。
@Query(value = "SELECT * FROM users WHERE tsv @@ plainto_tsquery(:q)",
nativeQuery = true)
List<User> fullTextSearch(@Param("q") String query);使用 @Modifying 执行修改查询
请使用 @Modifying 注解标记更新或删除查询。由于修改查询需要活动事务,请添加 @Transactional。
@Modifying
@Transactional
@Query("UPDATE User u SET u.status = :s WHERE u.lastLogin < :cutoff")
int deactivateInactiveUsers(@Param("s") UserStatus s,
@Param("cutoff") LocalDateTime cutoff);派生删除方法
Spring Data 也会根据方法名生成删除查询,方便执行清理操作。
void deleteByStatus(UserStatus status);
long deleteByCreatedAtBefore(LocalDateTime cutoff);仓库切片:CrudRepository、PagingAndSortingRepository
如果不需要 JpaRepository 的全部方法,请使用功能更精简的基础接口。CrudRepository 提供基本的增删改查功能;PagingAndSortingRepository 额外提供 findAll(Pageable)。
public interface ReadOnlyUserRepository extends PagingAndSortingRepository<User, Long> {
// Only paging + sorting — no save/delete
}使用 @EntityGraph 优化获取
请使用 @EntityGraph 按查询覆盖默认获取策略,在不更改实体映射的情况下,主动加载关联对象。
@EntityGraph(attributePaths = {"orders", "orders.items"})
@Query("SELECT u FROM User u WHERE u.id = :id")
Optional<User> findWithOrders(@Param("id") Long id);自定义仓库实现
按照 UserRepositoryCustom + UserRepositoryCustomImpl 的命名约定,创建一个接口和实现类,即可添加自定义方法。Spring 会将它们合并。
public interface UserRepositoryCustom {
List<User> searchByCriteria(UserSearchCriteria criteria);
}
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
@PersistenceContext EntityManager em;
public List<User> searchByCriteria(UserSearchCriteria c) {
// use Criteria API or JdbcTemplate
}
}
public interface UserRepository extends JpaRepository<User,Long>, UserRepositoryCustom {}快速检查
对于 UPDATE/DELETE 语句,需要与 @Query 一起使用哪个注解?
回顾
扩展 JpaRepository 即可获得免费的增删改查功能。对于简单查询,请使用派生方法名。对于复杂 JPQL 或原生数据库查询,请使用 @Query。更新操作使用 @Modifying+@Transactional。使用 @EntityGraph 调整获取策略。
常见问题解答
「Spring Data 仓库与查询方法」课时是免费的吗?
是的 — 「Spring Data 仓库与查询方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「Spring Data 仓库与查询方法」这节课中我会学到什么?
扩展 JpaRepository,按照命名约定定义查询方法,并使用 @Query 编写自定义 JPQL 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「Spring Data 仓库与查询方法」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 JPA 注解映射实体
- Spring Data 仓库与查询方法
- 一对多与多对多关系
- 分页、排序与投影