query did not return a unique result

박영준·2023년 8월 23일
0

Troubleshooting

목록 보기
16/29

1. 발생한 에러 메시지

	// 채팅방 생성
	public MessageResponseDto createRoom(MessageRequestDto messageRequestDto, User user) {
        Post post = postRepository.findById(messageRequestDto.getPostId()).orElseThrow(
                () -> new IllegalArgumentException("게시글을 찾을 수 없습니다.")
        );

        MessageRoom messageRoom = messageRoomRepository.findBySenderAndReceiver(user.getNickname(), messageRequestDto.getReceiver());

        // 처음 쪽지방 생성 또는 이미 생성된 쪽지방이 아닌 경우
        if ((messageRoom == null) || !(messageRoom.getPost().getId().equals(messageRequestDto.getPostId()))) {
            MessageRoomDto messageRoomDto = MessageRoomDto.create(messageRequestDto, user);
            opsHashMessageRoom.put(Message_Rooms, messageRoomDto.getRoomId(), messageRoomDto);      // redis hash 에 쪽지방 저장해서, 서버간 채팅방 공유
            messageRoom = messageRoomRepository.save(new MessageRoom(messageRoomDto.getId(), messageRoomDto.getRoomName(), messageRoomDto.getSender(), messageRoomDto.getRoomId(), messageRoomDto.getReceiver(), user, post));

            return new MessageResponseDto(messageRoom);
        // 이미 생성된 쪽지방인 경우
        } else {
            return new MessageResponseDto(messageRoom.getRoomId());
        }
    }

query did not return a unique result: 2

JPA를 통해 DB 에서 데이터를 가져오는 중 에러가 발생했다.

2. 발생 원인

이는 Repository에서 조회 결과는 2개인데 Class로 받아 담을 수 없기 때문에 발생한다.

해당 에러가 발생하면, 항상 DB 에서 조회해오는 부분을 확인하자!

3. 해결법

방법 1. List 로 받기

조회해오는 데이터가 1개가 아니기 때문에, List 로 목록을 받아올 수 있다.

방법 2. 조회 조건 세부화

JPA 로 DB 를 조회할 때, 오로지 1개의 데이터만 조회하도록 수정해줄 수 있다.

// 수정 전
MessageRoom messageRoom = messageRoomRepository.findBySenderAndReceiver(user.getNickname(), messageRequestDto.getReceiver());

// 수정 후
MessageRoom messageRoom = messageRoomRepository.findBySenderAndReceiverAndPostId(user.getNickname(), messageRequestDto.getReceiver(), messageRequestDto.getPostId());
  • 수정 전 : findBySenderAndReceiver

    • sender 와 receiver 로 messageRoom 테이블을 조회한다.
      이 경우, 2개의 데이터가 조회된다.
  • 수정 후 : findBySenderAndReceiverAndPostId

    • sender 와 receiver, postId 로 messageRoom 테이블을 조회한다.
      이 경우, 1개의 데이터가 조회된다.

참고: query did not return a unique result 해결

profile
개발자로 거듭나기!

0개의 댓글