querydsl 사용을 하면서 서브쿼리 세개를 union all 시켰더니 속도가 느려지면서 오류가 발생했다.




쿼리상 문제는 없었지만, 실행시간이 길어지면서 서버에서 자동으로 오류로 지정하는 것이었다.
connection leak detection 과 readtimeout exception 이었다.
결국에는 도움을 받아 해결하게 되었는데,
querydsl 형태로는 도저히 해결이 되지 않아 native sql을 그대로 갖다 붙였다.

StringBuilder sql = new StringBuilder();

    sql.append("	SELECT (");
    sql.append("	        select");
    sql.append("	          count(*) reviewN");
    sql.append("	        from");

...생략....

Query query = entityManager.createNativeQuery(sql.toString());
    query.setParameter("usrId", usrId);

    JpaResultMapper res = new JpaResultMapper();
    reviewListCountDecimal count = res.uniqueResult(query, reviewListCountDecimal.class);

    return reviewListCount
        .builder()
        .reviewN(count.getReviewY().intValue())
        .reviewY(count.getReviewN().intValue())
        .build();



이렇게 넣으니 오류없이 잘 돌아간다!!!



JPA에서는 특정 데이터베이스에 종속적인 기능은 잘 지원하지 않기 때문에, SQL을 직접 사용할 수 있는 기능을 제공하는데
그것이 바로 네이티브 SQL 이라고 한다.
반환타입이 명시되어도 Query 객체로 반환받는다고 한다.
결과를 엔터티가 아닌 DTO로 반환받고 싶다면, JpaResultMapper를 사용한다.
JpaResultMapper 에 Native Query와 DTO를 넘겨주면 된다.



querydsl로는 도저히 해결을 할 수 없거나 구현이 안되는 부분은
귀찮긴 하지만 어쩔 수 없이 native query를 사용할 수 밖에 없을 것 같다 ㅠ_ㅠ