0Pricing
Java Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 JPA 注解映射实体
  2. Spring Data 仓库与查询方法
  3. 一对多与多对多关系
  4. 分页、排序与投影
← 返回 Java Academy