natyus
natyus

Reputation: 647

how to look if List exists in DB in Springboot

I have a springboot application where I am saving a list with my Meeting Entity. I can save my entities all at once, but I want to check before each save if one entity inside my list already exists inside my Db and then just save the ones which are not inside. But I am kinda stuck and do not know how to do it. Could someone look at my code and give me an advice?

MeetingController:

  @PostMapping("/")
public void saveMeeting(@RequestBody List<Meeting> meeting){
    List<Meeting> exist =
            meetingService.findAllMeetingsWithName(meeting.stream().map(m -> m.getMeetingName()).collect(Collectors.toList()));
    meeting.removeAll(exist);
    meetingService.saveMeeting(meeting);
}

MeetingService:

public void saveMeeting(List<Meeting> meeting){

        meetingRepository.saveAll(meeting);

    }

Repository:

@Repository
public interface MeetingRepository extends JpaRepository<Meeting, Long> {
}

Upvotes: 0

Views: 1884

Answers (3)

Superchamp
Superchamp

Reputation: 146

Since you already are planning to use JpaRepository, take advantage of the @Query and batch queries

@Repository
//custom query using IN
public interface MeetingRepository extends JpaRepository<Meeting, Long>
{
  @Query("SELECT m from MEETING m where m.name IN (:names)")
  public List<Meetings> findAllMeetingWithNames(List<String> meetings)
}

@Service
class MeetingService{

    private MeetingRepository meetingRepository;
    ...
    //other code....

    @Autowired
    public MeetingService(MeetingRepository meetingRepository){
      this.meetingRepository = meetingRepository;  
    }
    
    public void saveAllMeetings(List<Meeting> meetings){
        //call repository custom query here
        names = meetings.stream()
            .map((m) -> m.name)
            .collect(Collectors.toList());

        List<Meeting> existingMeetings = meetingRepository.findAllMeetingWithNames(names);
        //delete using a single query
        meetingRepository.deleteAllInBatch(existingMeetings);
        meetingRepository.saveAllAndFlush(meetings);
        
    }
    .....
}

Upvotes: 0

Panagiotis Bougioukos
Panagiotis Bougioukos

Reputation: 19108

This is the functionality that you want

   @Transactional
   public void saveMeeting(List<Meeting> meeting){

        List<Meeting> alreadyExist = meetingRepository.findByMeetingNameIn(meeting.stream().map(m -> m.getMeetingName()).collect(Collectors.toList());

        meeting.removeAll(alreadyExist);
        meetingRepository.saveAll(meeting);

    }

and then just define that repository method

@Repository
public interface MeetingRepository extends JpaRepository<Meeting, Long> {

  List<Meeting> findByMeetingNameIn (List<String> meetingNames);

}

Remember to override equals and hashcode in Meeting entity to consider the id field.

Upvotes: 1

Sachin Mamoru
Sachin Mamoru

Reputation: 486

You can check whether your meetings are in the DB. Try this.

 List<Meeting> findByValueIn(List<Meeting> values);

Upvotes: 0

Related Questions