Query 정리를 해보자.
1. keyword 찾기
@Query("SELECT q FROM Question q WHERE lower(q.title) like lower(CONCAT('%', :keyword, '%')) OR q.content like lower(CONCAT('%', :keyword, '%'))")
Optional<Page<Question>> findByKeyword(@Param("keyword") String keyword, Pageable pageable);
- Question테이블에서 title을 소문자 정렬하고 keyword가 들어간 것 아니면 content를 소문자 정렬하고 keyword가 들어간 내용을 찾는 query
- keyword라는 파라미터가 들어가니 @Param을 사용해서 파라미터를 넣어준 모습.
2. TagName 찾기
@Query("SELECT q FROM Question q INNER JOIN q.questionTags qt INNER JOIN qt.tag t WHERE t.tagName = :tagName")
Page<Question> findByTagName(@Param("tagName") String tagName, Pageable pageable);
- Question테이블에서 QuestionTag를 join하고 tag를 한번더 조인(다대다 관계라 이렇게 두번 INNER JOIN을 해야함) 태그를 태그네임으로 찾는 query
3. Best Answer 찾기
@Query("SELECT a FROM Answer a INNER JOIN Question q WHERE q.questionId = :questionId AND a.bestAnswer = :bestAnswer")
Answer findByQuestionIdAndBestAnswer(@Param("questionId") Long questionId, @Param("bestAnswer") Long bestAnswer);
- Answer테이블에서 Question 테이블을 Join하고 questionId와 bestAnswer인 answer를 찾는 query