일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백트래킹
- 지연로딩
- 스토어드 프로시저
- dfs
- 데코레이터
- querydsl
- 즉시로딩
- FetchType
- CHECK OPTION
- 힙
- SQL프로그래밍
- 유니크제약조건
- fetch
- 연결리스트
- exclusive lock
- JPQL
- 비관적락
- 다대일
- shared lock
- PS
- execute
- BOJ
- 스프링 폼
- eager
- 일대다
- 동적sql
- 이진탐색
- 낙관적락
- 다대다
- 연관관계
- Today
- Total
목록querydsl (14)
흰 스타렉스에서 내가 내리지
# 스프링 데이터의 Page, Pageable 활용 @Override public Page searchPage(MemberSearchCondition condition, Pageable pageable) { List content = queryFactory .select(new QMemberTeamDto( member.id, member.username, member.age, team.id, team.name)) .from(member) .leftJoin(member.team, team) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(con..
# 회원 검색 조건 클래스 @Data public class MemberSearchCondition { //회원명, 팀명, 나이(ageGoe, ageLoe) private String username; private String teamName; private Integer ageGoe; private Integer ageLoe; } # 동적 쿼리 - Builder 사용 // Builder 사용 // 회원명, 팀명, 나이 (ageGoe, ageLoe) public List searchByBuilder(MemberSearchCondition condition){ BooleanBuilder builder = new BooleanBuilder(); if(StringUtils.hasText(condition.g..
# member → M @Test public void sqlFunction(){ List result = queryFactory .select(Expressions.stringTemplate( "function('replace', {0}, {1}, {2})", member.username, "member", "M")) .from(member) .fetch(); } select m.username from member m; select replace(m.username, 'member', 'M') from member m; # 소문자로 변경해서 비교하라 @Test public void sqlFunction2(){ List result = queryFactory .select(member.username)..
# 벌크 연산 쿼리 한 번으로 대량 데이터 수정 # 나이가 28 미만인 회원의 이름을 비회원으로 지정 @Test @Commit public void bulkUpdate(){ long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); em.flush(); em.clear(); List result = queryFactory .selectFrom(member) .fetch(); for (Member member1 : result){ System.out.println("member1 = " + member1); } } 벌크 연산이 수행되는 순간 영속성 컨텍스트와 DB 는 일치..
# 동적 쿼리를 해결하는 두가지 방식 1. BooleanBuilder 2. Where 다중 파라미터 사용 BooleanBuilder 도 많이 쓰이지만, 이 방법을 사용하면 훨씬 깔끔해진다. private List searchMember2(String usernameCond, Integer ageCond){ return queryFactory .selectFrom(member) .where(usernameEq(usernameCond), ageEq(ageCond)) .fetch(); } private BooleanExpression usernameEq(String usernameCond){ return usernameCond != null ? member.username.eq(usernameCond) : n..
# 동적 쿼리를 해결하는 두가지 방식 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 ..