我如何检查记录是否已存在于 spring boot JPA 的 table 中?

How do i check if a record already exists in table in springboot JPA?

我有一个包含 4 个字段的 table。如果我插入了一条已经存在的记录,即所有字段值都与 table 中的先前记录相匹配。我如何 return 只记录而不插入数据库?

我的模型是这样的:

@Entity
public class QuestionDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String department;
    private String year;
    private String academic_year;
    private String semester;
    private String type;
    private String subject;
    private int points;
    private int unit;

// getter, setter

控制器看起来是这样的:

@Autowired
public QuestionDetailsRepository qdRepository;

 @PostMapping("/api/questionDetails")
 public QuestionDetails addQuestion(@Valid @RequestBody QuestionDetails qDetails) {

// here i want to first check if qDetails object is already present in table . 
If present i want to return that existed record instead of inserting into table.


            QuestionDetails qd = qdRepository.save(qDetails); // save only new record
    
            return qd;
        }

使用邮递员我发送这样的数据:

{
 "department" : "IT",
 "year" : "2020",
 "academic_year" : "1st year",
 "semester" : "first semester",
 "type" : "objective",
 "subject" : "JAVA",
 "points" : 10,
 "unit" : 5
}

在这里,我发送的数据已经存在于 table 中。所以,我想检查这条记录是否已经存在?如果不存在则插入 table 否则 return 存在的记录。

如何使用 springboot Jpa hibernate 实现?

QuestionDetailsRepository 中实现一个 select 方法,如下所示。添加使记录唯一的所有条件。我使用的是部门和年份,但您可以使用 QuestionDetails 实体的所有参数。

@Query("select qd from QuestionDetails qd where qd.department = :#{#req. department} and qd.year = :#{#req.year}")
Optional<QuestionDetails> findQuestionDetails(@Param("req") QuestionDetails req);

确保根据唯一标准在 QuestionDetails class 中实施 equals()hashCode()

您的伪代码如下所示:

Optinal<QuestionDetails> optRecord = qdRepository.findQuestionDetails(qDetails);
if(opt.isPresent()){
  return opt.get();
}else{
  qdRepository.save(qDetails);
}