인프런 커뮤니티 질문&답변

jsungmin6님의 프로필 이미지
jsungmin6

작성한 질문수

실전! Querydsl

쿼리문 작성 질문입니다!

작성

·

316

0

안녕하세요 강사님! 강의 항상 열심히 듣고 있습니다.

이번에 스프링을 배운김에 토이 프로젝트를 하나 하고 있습니다.

기능중에 준비된 랜덤단어 두 개 로 유저의 닉네임을 랜덤으로 지어주는 기능을 만들려고 합니다.

그래서 랜덤단어X랜덤단어를 만드는거는 쉽지만 user table 에 이미 있는 닉네임이면

클라에 주기 전에 서버에서 먼저 거르는 작업을 하고자 합니다.

랜덤단어 하나를 만들어서 DB에 존재하는지 검사하는 로직을 통과할때까지 while문으로 돌릴까 생각하였지만 db와 연결을 너무 많이 하게 될 것 같아 포기하고 sql문으로 해결할 수 없는지 생각해 보았습니다.

그래서 생각한게 랜덤단어가 들어있는 테이블을 두 개 만들어서 세타조인을 해서 하나의 테이블을 만들고,  유저테이블에서 나온 닉네임과 대칭 차집합을 통해 아직 만들어지지 않은 닉네임들을 후보까지 안전하게 10개를 뽑아서 클라에 넘겨주자는 생각을 했습니다.

그래서 대칭 차집합 쿼리를 찾아보니 

SELECT str FROM (
	SELECT str FROM tableA
	UNION ALL
	SELECT str FROM tableB
) AS tmp
GROUP BY str HAVING COUNT(*)=1

이렇게 구현할 수 있다는 것을 알게 되었습니다.

근데 jpql은 FROM 절에 서브쿼리를 적을 수 없어 이것을 구현할 수 없다고 생각했습니다.

혹시 뭔가 다른 구현이 가능한 방법이 있을까 해서 질문 드립니다!

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. jsungmin6님

쿼리는 네이티브 쿼리를 사용하셔야 할 듯 합니다.

그런데 제 생각에는 로직을 반복해도 크게 문제는 없을 것 같아요.

랜덤단어가 실제 DB에 들어있을 확율은 매우 낮으니까요.

감사합니다.

jsungmin6님의 프로필 이미지
jsungmin6

작성한 질문수

질문하기