题目
Spring Data JPA 中 Repository 接口的基本使用
信息
- 类型:问答
- 难度:⭐
考点
Repository接口作用, 方法命名规则, 基础CRUD操作
快速回答
Spring Data JPA 的 Repository 接口是数据访问的核心组件,主要功能包括:
- 内置CRUD方法:通过继承 CrudRepository 或 JpaRepository 获得
- 自动查询生成:遵循命名规范的方法会自动实现查询逻辑
- 减少样板代码:无需手动编写实现类
1. Repository 接口的核心作用
Repository 是 Spring Data JPA 的核心接口,标记为 @Repository。开发者只需声明接口,Spring 会在运行时自动生成实现:
- CrudRepository:提供基础的 CRUD 功能
- JpaRepository:扩展 CrudRepository,增加分页/排序等 JPA 特定功能
2. 基础使用示例
定义实体类:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// 省略 getter/setter
}声明 Repository 接口:
public interface UserRepository extends JpaRepository<User, Long> {
// 自动根据方法名生成查询
List<User> findByName(String name);
// 使用 @Query 自定义 JPQL
@Query("SELECT u FROM User u WHERE u.email LIKE %?1%")
List<User> findByEmailContaining(String keyword);
}3. 方法命名规则
Spring Data JPA 自动解析方法名生成查询:
- 关键字:findBy, readBy, queryBy, countBy, deleteBy
- 属性条件:
findByNameAndEmail(String name, String email) - 比较操作:
findByAgeGreaterThan(int age) - 排序:
findByNameOrderByEmailDesc(String name)
4. 最佳实践
- 优先使用 JpaRepository 而非 CrudRepository(功能更全)
- 复杂查询使用
@Query明确语义 - 返回类型推荐:
List<T>,Optional<T>,Page<T>
5. 常见错误
- 方法名拼写错误:如
findbyName(正确应为findByName) - 参数顺序不匹配:方法参数需与属性条件顺序一致
- 忽略事务:写操作需在
@Transactional方法中调用
6. 扩展知识
- 分页查询:
Page<User> findByName(String name, Pageable pageable); - 投影查询:使用接口投影部分字段
interface UserProjection { String getName(); } - 动态查询:结合 Querydsl 或 Specification 实现复杂条件