Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Kernighan의 C언어 프로그래밍
- 코드로배우는스프링웹프로젝트
- 처음 만나는 AI수학 with Python
- d
- 자료구조와 함께 배우는 알고리즘 입문
- 자료구조와함께배우는알고리즘입문
- 서버설정
- 페이징
- 이터레이터
- GIT
- 코드로배우는스프링부트웹프로젝트
- 티스토리 쿠키 삭제
- 알파회계
- 스프링 시큐리티
- 스프링부트핵심가이드
- iterator
- ㅒ
- 처음 만나는 AI 수학 with Python
- /etc/network/interfaces
- 자바편
- 친절한SQL튜닝
- 목록처리
- 데비안
- network configuration
- 구멍가게코딩단
- 리눅스
- 네트워크 설정
- resttemplate
- baeldung
- 선형대수
Archives
- Today
- Total
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:321. 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'
'Framework > Spring' 카테고리의 다른 글
[bootBoard] N:1(다대일) 연관관계: 11-4. JPQLQuery로 Page<Object[]> 처리 (0) | 2022.10.11 |
---|---|
[bootBoard] N:1(다대일) 연관관계: 11-3. Tuple객체, groupBy()를 사용한 집합 함수 처리 (0) | 2022.10.11 |
[bootBoard] N:1(다대일) 연관관계: 11-1. 검색처리: JQPL을 사용한 검색 (0) | 2022.10.09 |
[bootBoard] N:1(다대일) 연관관계: 10-4 화면처리: 게시물 수정/삭제 처리 (0) | 2022.10.09 |
[bootBoard] N:1(다대일) 연관관계: 10-3 화면처리: 게시물 조회 처리 (0) | 2022.10.09 |
Comments