일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- eager
- 낙관적락
- PS
- SQL프로그래밍
- 연결리스트
- JPQL
- querydsl
- FetchType
- BOJ
- dfs
- 유니크제약조건
- 다대일
- 스토어드 프로시저
- 일대다
- 다대다
- 연관관계
- 지연로딩
- shared lock
- execute
- 비관적락
- fetch
- 스프링 폼
- CHECK OPTION
- 데코레이터
- 힙
- 백트래킹
- 이진탐색
- 동적sql
- 즉시로딩
- exclusive lock
- Today
- Total
목록JPA (46)
흰 스타렉스에서 내가 내리지
# 동적 쿼리를 해결하는 두가지 방식 1. BooleanBuilder 2. Where 다중 파라미터 사용 private List searchMember1(String usernameCond, Integer ageCond){ BooleanBuilder builder = new BooleanBuilder(); if (usernameCond != null){ builder.and(member.username.eq(usernameCond)); } if (ageCond != null){ builder.and(member.age.eq(ageCond)); } return queryFactory .selectFrom(member) .where(builder) .fetch(); }
List result = queryFactory .select(member.username).distinct() .from(member) .fetch();
# 1. JPQL 을 이용한 DTO 조회 @Data @NoArgsConstructor @AllArgsConstructor public class MemberDto { private String username; private int age; } List resultList = em.createQuery( "select new study.querydsl.dto.MemberDto(m.username, m.age)" + " from Member m", MemberDto.class) .getResultList(); 순수 JPA 에서 DTO 를 조회할 때는 new 명령어를 사용해야 함 DTO 의 package 이름을 다 적어줘야 해서 지저분하다. 생성자 방식만 지원한다. # Querydsl 빈 생성 - 결과를 D..
- com.querydsl.jpa.JPAExpressions 사용 /** * 서브 쿼리 * 나이가 가장 많은 회원 조회 */ @Test public void subQuery() { QMember memberSub = new QMember("memberSub"); List result = queryFactory .selectFrom(member) .where(member.age.eq( JPAExpressions .select(memberSub.age.max()) .from(memberSub) )) .fetch(); assertThat(result).extracting("age").containsExactly(40); } /** * 나이가 평균 나이 이상인 회원 */ @Test public void subQ..
join(조인 대상, 별칭으로 사용할 Q타입) # 기본 조인 /** * 팀 A에 소속된 모든 회원 */ @Test public void join(){ QMember member = QMember.member; QTeam team = QTeam.team; List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); assertThat(result) .extracting("username") .containsExactly("member1", "member2"); } join(), innerJoin() : 내부 조인 (inner join) leftJoin() : left ..
# 집합 함수 /** * JPQL * select * COUNT(m), // 회원 수 * SUM(m.age), // 나이 합 * AVG(m.age), // 평균 나이 * MAX(m.age), // 최대 나이 * MIN(m.age), // 최소 나이 * from Member m */ @Test public void aggregation(){ List result = queryFactory .select(member.count(), member.age.sum(), member.age.avg(), member.age.max(), member.age.min()) .from(member) .fetch(); Tuple tuple = result.get(0); assertThat(tuple.get(member.cou..
# 정렬 /** * 회원 정렬 순서 * 1. 회원 나이 내림차순 (desc) * 2. 회원 나이 오름차순 (asc) * 단 2에서 회원 이름이 없으면 마지막에 출력 (nulls last) */ @Test public void sort(){ em.persist(new Member(null, 100)); em.persist(new Member("member5", 100)); em.persist(new Member("member6", 100)); List result = queryFactory .selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), member.username.asc().nullsLast()) .fetch(); Me..
fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환 fetchOne() : 단 건 조회 결과가 없으면 : null 결과가 둘 이상이면 com.querydsl.core.NonUniqueResultException 발생 fetchFirst() : limit(1).fetchOne() fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행 DEPRECATED fetchCount() : count 쿼리로 변경해서 count 수 조회 DEPRECATED @Test public void resultFetch(){ List fetch = queryFactory .selectFrom(member) .fetch(); Member member1 = queryFactory .sele..
# 기본 검색 쿼리 @Test public void search(){ Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1") .and(member.age.eq(10))) .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("member1"); } 검색 조건은 .and(), .or() 를 메서드 체인으로 연결할 수 있다. 참고 : select, from 을 selectFrom 으로 합칠 수 있다. # JPQL 이 제공하는 모든 검색 조건 제공 member.username.eq("member1") // username = 'member1' membe..
1. Dependency 설치 dependencies { implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } 2. Configuration 프로젝트 어디에서나 접근할 수 있도록, QueryDSL 빈을 생성한다. 이때 EntityManager 도 여기서 주입해 놓는다. @Configuration @RequiredAr..