0

4つのフィールドを持つテーブルがあります。そして、既に存在するレコードを挿入した場合、つまりすべてのフィールド値がテーブルの前のレコードと一致します。データベースに挿入せずにレコードのみを返すにはどうすればよいですか?

私のモデルは次のようになります。

@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
}

ここでは、テーブルに既に存在するデータを送信しています。それで、このレコードがすでに存在するかどうかを確認したいですか?存在しない場合はテーブルに挿入し、それ以外の場合はその存在するレコードを返します。

springboot Jpa休止状態を使用してそれを達成するにはどうすればよいですか?

4

1 に答える 1

1

以下のように select メソッドを実装しますQuestionDetailsRepository。レコードを一意にするすべての基準を追加します。部門と年を使用していますが、QuestionDetailsエンティティのすべてのパラメーターを使用できます。

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

独自の基準に従ってクラスにequals()andhashCode()を実装するようにしてください。QuestionDetails

疑似コードは次のようになります。

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

于 2020-12-04T04:11:21.487 に答える