관리 메뉴

bright jazz music

[bootBoard] N:1(다대일) 연관관계: 11-2. 검색처리: JQPL을 사용한 검색 / leftJoin(), on() 본문

Framework/Spring

[bootBoard] N:1(다대일) 연관관계: 11-2. 검색처리: JQPL을 사용한 검색 / leftJoin(), on()

bright jazz music 2022. 10. 11. 08:32

1. SearchBoardRepositoryImpl에 JPQL  작성하기 :JPQLQuery객체

 

로그 찍히는 것을 확인했으니, 실제 JPQL을 ㅈ가성해 보자

  • 이 과정에서 Querydsl 라이브러리 내에 JPQLQuery라는 인터페이스를 활용한다.

 

//SearchBoardRepositoryImpl.java

package com.example.bootboard.repository.search;

import com.example.bootboard.entity.Board;
import com.example.bootboard.entity.QBoard;
import com.querydsl.jpa.JPQLQuery;
import lombok.extern.log4j.Log4j2;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;

import java.util.List;

@Log4j2
public class SearchBoardRepositoryImpl extends QuerydslRepositorySupport
        implements SearchBoardRepository {

    //생성자
    public SearchBoardRepositoryImpl(){
        super(Board.class); //여기서 super는 querydslRepositorySupport이다.
    }

    @Override
    public Board search1(){
        log.info("search1............");
        //JPQL 사용
        //이제 로그가 찍힐 뿐만 아니라 아래의 JPQL도 실행된다.

        //Q도메인의 QBoard
        QBoard board = QBoard.board;

        JPQLQuery<Board> jpqlQuery = from(board);
        jpqlQuery.select(board).where(board.bno.eq(3L)); //bno가 3번인 데이터를 select
        
        log.info("------------------------------");
        log.info(jpqlQuery);
        log.info("------------------------------");

        List<Board> result = jpqlQuery.fetch();
        return null;
    }
}

 

 

2. 테스트 : search1()

//BoardRepositoryTests.java


@SpringBootTest
public class BoardRepositoryTests {

///

    @Test
    public void testSearch1(){
        boardRepository.search1();
    }
///

}

 

콘솔 로그

2022-10-11 08:13:58.529  INFO 19144 --- [    Test worker] c.e.b.repository.BoardRepositoryTests    : Started BoardRepositoryTests in 4.434 seconds (JVM running for 5.963)
2022-10-11 08:13:58.759  INFO 19144 --- [    Test worker] c.e.b.r.s.SearchBoardRepositoryImpl      : search1............
2022-10-11 08:13:58.822  INFO 19144 --- [    Test worker] c.e.b.r.s.SearchBoardRepositoryImpl      : ------------------------------
2022-10-11 08:13:58.829  INFO 19144 --- [    Test worker] c.e.b.r.s.SearchBoardRepositoryImpl      : select board
from Board board
where board.bno = ?1
2022-10-11 08:13:58.829  INFO 19144 --- [    Test worker] c.e.b.r.s.SearchBoardRepositoryImpl      : ------------------------------
Hibernate: 
    select
        board0_.bno as bno1_0_,
        board0_.moddate as moddate2_0_,
        board0_.reg_date as reg_date3_0_,
        board0_.content as content4_0_,
        board0_.title as title5_0_,
        board0_.writer_email as writer_e6_0_ 
    from
        board board0_ 
    where
        board0_.bno=?
2022-10-11 08:13:58.985  INFO 19144 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2022-10-11 08:13:58.992  INFO 19144 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2022-10-11 08:13:59.001  INFO 19144 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.5/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 17s
  • ---- ---- 구분 선 사이에 JPQL  문자열과 동일
  • 아래 쪽에는 실제 SQL이 동작하는 것을 확인할 수 있음.

 

 

3. JPQLQuery의 leftJoin() / on()

JPQLQuery로 다른 엔티티와 조인을 처리하기 위해서는 아래와 같은 메서드를 이용한다.

  • join()
  • leftJoin()
  • rightJoin()
  • on()

Board와 같이 Reply와 left(outer) join 을 이용해야 하는 경우라면 다음과 같이 코드를 작성할 수 있다.

 

package com.example.bootboard.repository.search;

import com.example.bootboard.entity.Board;
import com.example.bootboard.entity.QBoard;
import com.example.bootboard.entity.QReply;
import com.querydsl.jpa.JPQLQuery;
import lombok.extern.log4j.Log4j2;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;

import java.util.List;

import static com.example.bootboard.entity.QBoard.board;

@Log4j2
public class SearchBoardRepositoryImpl extends QuerydslRepositorySupport
        implements SearchBoardRepository {

    //생성자
    public SearchBoardRepositoryImpl(){
        super(Board.class); //여기서 super는 querydslRepositorySupport이다.
    }

    @Override
    public Board search1(){
        log.info("search1............");
        //JPQL 사용
        //이제 로그가 찍힐 뿐만 아니라 아래의 JPQL도 실행된다.


        QBoard board = QBoard.board;
        QReply reply = QReply.reply;

        JPQLQuery<Board> jpqlQuery = from(board);
        jpqlQuery.leftJoin(reply).on(reply.board.eq(board));

        List<Board> result = jpqlQuery.fetch();
        return null;
    }


//        //Q도메인의 QBoard
//        QBoard board = QBoard.board;
//        JPQLQuery<Board> jpqlQuery = from(board);
//        jpqlQuery.select(board).where(board.bno.eq(3L)); //bno가 3번인 데이터를 select
//
//        log.info("------------------------------");
//        log.info(jpqlQuery);
//        log.info("------------------------------");
//
//        List<Board> result = jpqlQuery.fetch();
//        return null;
//    }

}

 

4. 테스트

테스트는 똑같이 하면 된다.

 

테스트 결과는 아래와 같다. 조인이 된 것을 확인할 수 있다.

 

콘솔 로그

2022-10-11 08:28:12.685  INFO 12584 --- [    Test worker] c.e.b.repository.BoardRepositoryTests    : Started BoardRepositoryTests in 4.663 seconds (JVM running for 6.317)
2022-10-11 08:28:12.845  INFO 12584 --- [    Test worker] c.e.b.r.s.SearchBoardRepositoryImpl      : search1............
Hibernate: 
    select
        board0_.bno as bno1_0_,
        board0_.moddate as moddate2_0_,
        board0_.reg_date as reg_date3_0_,
        board0_.content as content4_0_,
        board0_.title as title5_0_,
        board0_.writer_email as writer_e6_0_ 
    from
        board board0_ 
    left outer join
        reply reply1_ 
            on (
                reply1_.board_bno=board0_.bno
            )
2022-10-11 08:28:12.979  INFO 12584 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments