일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- eager
- 동적sql
- 연관관계
- CHECK OPTION
- 지연로딩
- 유니크제약조건
- fetch
- dfs
- 데코레이터
- 백트래킹
- 다대다
- 다대일
- 연결리스트
- PS
- shared lock
- 이진탐색
- 낙관적락
- querydsl
- 비관적락
- execute
- JPQL
- FetchType
- 스토어드 프로시저
- BOJ
- 스프링 폼
- exclusive lock
- 즉시로딩
- 힙
- 일대다
- SQL프로그래밍
- Today
- Total
목록전체 글 (556)
흰 스타렉스에서 내가 내리지
다음과 같은 템플릿을 따라가라. 대부분은 해결 가능할 것. def dfs(...): if ... :# 결과 도출 or 함수 종료 조건 return for ... :# 다음 탐색 노드들 if ... :# 볼 필요도 없는 얘들 제거 dfs(,,,)# 재귀 호출 # 예시 def dfs(graph, v, visited): visited[v] = True # 현재 노드를 방문 처리 print(v, end= ' ') for i in graph[v]: # 현재 노드와 연결된 다른 노드를 재귀적으로 방문 if not visited[i]: dfs(graph, i, visited) """ 정수 N을 입력받아 1부터 N 까지의 숫자 중에서 합이 10이 되는 조합을 리스트로 반환 """ def solution(N): resu..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/2SiHC/btsGPaTW6Jk/CF9m8kVR4kp4izXVfImsgK/img.png)
# 스프링 데이터의 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..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/vy3Kb/btsGNtUsVB7/8UQu5CedL9MZ1Z1LviVXe0/img.png)
이 때, search() 는 querydsl 메소드이다. public interface MemberRepository extends JpaRepository, MemberRepositoryCustom { List findByUsername(String username); } /***/ public interface MemberRepositoryCustom { List search(MemberSearchCondition condition); } /***/ public class MemberRepositoryImpl implements MemberRepositoryCustom{ private final JPAQueryFactory queryFactory; public MemberRepositoryImpl(E..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/by8XRb/btsGNa1XaLH/7fXryDh0o6Hk7R1leByva1/img.png)
# 회원 검색 조건 클래스 @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..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/c7meBv/btsGLFaLgb9/fYrvB24KwNmKjmlQiqsN20/img.png)
# 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..