Spring Rest API自定义Student Repository:idnumber查询与重复校验
自定义StudentRepository实现指定需求
现有代码回顾
Student实体类
@Table(name = "student") public class Student { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; private String firstname; private String lastname; private String idnumber; private String adress; private boolean active=Boolean.TRUE; @OneToMany( mappedBy="student") private Set<Contact> contacts = new HashSet<>(); @ManyToMany(mappedBy = "students") private Set<Team> teams = new HashSet<>(); }
基础StudentRepository接口
public interface StudentRepository extends JpaRepository<Student,Long> { }
解决方案实现
1. 扩展Repository接口,声明自定义方法
创建自定义接口,定义需要实现的功能方法:
public interface StudentCustomOperations { // 根据idnumber查询学生 Optional<Student> findByIdnumber(String idnumber); // 带idnumber重复校验的新增方法 Student saveWithIdnumberValidation(Student student); }
让原有的StudentRepository继承这个接口,统一对外暴露方法:
public interface StudentRepository extends JpaRepository<Student,Long>, StudentCustomOperations { }
2. 实现自定义逻辑类
按照Spring Data JPA规范,实现类命名为StudentRepositoryImpl(前缀为基础Repository名称,后缀固定为Impl):
@Repository public class StudentRepositoryImpl implements StudentCustomOperations { @Autowired private StudentRepository studentRepository; @Override public Optional<Student> findByIdnumber(String idnumber) { // 用Spring Data派生查询简化实现,无需手写JPQL return studentRepository.findByIdnumber(idnumber); } @Override public Student saveWithIdnumberValidation(Student student) { // 校验idnumber是否已存在 Optional<Student> existingStudent = studentRepository.findByIdnumber(student.getIdnumber()); if (existingStudent.isPresent()) { throw new IllegalStateException("idnumber: " + student.getIdnumber() + " 已存在,无法重复添加"); } return studentRepository.save(student); } }
3. (可选)优化:数据库层面加唯一约束
为了双重保障,在实体类的@Table注解中添加唯一约束,避免代码校验遗漏时出现重复数据:
@Table(name = "student", uniqueConstraints = {@UniqueConstraint(columnNames = "idnumber")}) public class Student { // ... 原有字段 }
4. (可选)自定义异常类
如果需要更清晰的异常类型,可自定义专属异常:
public class DuplicateIdnumberException extends RuntimeException { public DuplicateIdnumberException(String message) { super(message); } }
替换save方法中的异常抛出逻辑:
throw new DuplicateIdnumberException("idnumber: " + student.getIdnumber() + " 已存在,无法重复添加");
5. 业务层调用示例
@Service public class StudentService { @Autowired private StudentRepository studentRepository; // 根据idnumber查询学生 public Optional<Student> getStudentByIdnumber(String idnumber) { return studentRepository.findByIdnumber(idnumber); } // 新增学生(带重复校验) public Student addStudent(Student student) { return studentRepository.saveWithIdnumberValidation(student); } }
内容的提问来源于stack exchange,提问作者user20572341
相关产品推荐
相关产品推荐

