조인 조인의 사용 방법은 다음과 같습니다. join(조인 대상, 별칭으로 사용할 Q타입) 일반 조인 /** * 팀 A에 소속된 모든 회원(select, from)을 찾기 */ @Test fun join() { val fetch = query .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) //.where(member.team.name.eq("teamA")) - 똑같다 .fetch() fetch.forEach { println(it) } fetch.forEach { println(it.team) } } 세타조인 - 연관관계 없는 조인 /** * 세타 조인 - 연관관계 없는 조인 * * 회원의 이름이 팀 이름(from)과 ..
GroupBy 데이터를 그룹화하여 조회하기 위해 GroupBy를 사용합니다. having을 통해 그룹화된 결과를 제한할 수 있습니다. 셋업 코드 @BeforeEach fun before() { val teamA = Team(name = "teamA") val teamB = Team(name = "teamB") em.persist(teamA) em.persist(teamB) val members = listOf( Member(username = "member1", age = 10, team = teamA), Member(username = "member2", age = 20, team = teamA), Member(username = "member3", age = 30, team = teamB), Memb..
집계 (count, sum, avg, max, min) 집계 함수는 그룹 별로 그룹핑된 결과를 반환합니다. COUNT() : 총 개수 SUM() : 합 AVG() : 평균 MAX() : 최대값 MIN() : 최소값 사용 예시 셋업 코드 @BeforeEach fun before() { val teamA = Team(name = "teamA") val teamB = Team(name = "teamB") em.persist(teamA) em.persist(teamB) val members = listOf( Member(username = "member1", age = 10, team = teamA), Member(username = "member2", age = 20, team = teamA), Member(..
정렬 정렬은 orderBy()를 사용하여 수행할 수 있습니다. desc(), asc() : 내림차순, 오름차순 nullsLast() : null 인 경우 가장 마지막에 위치합니다. nullsFirst() : null 인 경우 가장 처음에 위치합니다. setup 코드 @BeforeEach fun before() { val teamA = Team(name = "teamA") val teamB = Team(name = "teamB") em.persist(teamA) em.persist(teamB) val members = listOf( Member(username = "member1", age = 10, team = teamA), Member(username = "member2", age = 20, team ..
결과 조회 메소드 fetch() : 리스트 조회, 데이터 없는 경우 빈 리스트 반환 fetchOne() : 단 건 조회 결과가 없으면 null 결과가 둘 이상이면 NonUniqueResultException fetchFirst() : limit(1).fetchOne()과 동일합니다. 다음은 QueryDSL 5.0 버전에서 Deprecate된 메서드입니다. fetchResult() : 페이징 정보 포함, total count 쿼리 추가 실행 fetchCount() : count 쿼리로 변경하여 count 수 조회 Reference 실전! Querydsl - 인프런 | 강의 Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, 복잡한 쿼리, 동적 쿼리는 이제 안녕! Querydsl로 자바 백엔드..
QueryDSL의 기본 검색 조건 쿼리는 다음과 같이 사용할 수 있습니다. @Test @DisplayName("검색 조건 쿼리 EX") fun testSearchQuery() { val eq: BooleanExpression = member.username.eq("member1") //username = "member1" val ne: BooleanExpression = member.username.ne("member1") //username != "member1" val eq_not: BooleanExpression = member.username.eq("member1").not() //username != "member1 val isNotNull: BooleanExpression = member.us..
Q-Type 쿼리dsl을 사용하면 QType을 통해 쿼리를 작성하게 됩니다. QType을 사용하는 방법에 대해서 알아보도록 하겠습니다. Q클래스 인스턴스를 사용하는 2가지 방법 new QMember("m") : 별칭(alias)을 직접 지정하는 방법입니다. JPQL 실행 시 select m From Member m ~~ 식으로 작성됩니다. QMember.member : QueryDSL이 기본으로 생성해주는 인스턴스를 사용하는 방법입니다 static-import를 사용하면 깔끔하게 사용하실 수 있습니다. 별칭을 직접 지정하는 방법은 같은 테이블을 Join하는 경우 혹은 서브쿼리를 사용하는 경우가 아니라면 잘 사용하지 않습니다. 별칭 직접 지정 @Test @DisplayName("Q타입 직접 생성하기") f..
JPA 표준 예외 처리 JPA의 표준 예외들은 javax.persistence.PersistenceException의 자식 클래스다. 그리고 이 예외 클래스는 RuntimeException의 자식이다. JPA 표준 예외는 크게 보면 2가지로 나눌 수 있다. 트랜잭션 롤백을 표시하는 예외 트랜잭션 예외를 표시하지 않는 예외 트랙잭션 롤백을 표시하는 예외는 심각한 예외이므로 복구해서는 안된다. 이 예외가 발생하면 트랜잭션을 강제로 커밋해도 트랜잭션이 커밋되지 않고 대신에 javax.persistence.RollbackException 예외가 발생한다. 반면에 트랜잭션 롤백을 표시하지 않는 예외는 심각한 예외가 아니다. 따라서 개발자가 트랜잭션을 커밋할지 롤백할지를 판단한다. 아래는 두 가지 분류의 예외를 표..