JPA
-
Querydsl에서 스프링 데이터 JPA의 페이징 활용JPA/Querydsl 2023. 8. 13. 20:19
스프링 데이터 JPA에서 페이징을 쉽게 하는 방법을 공부했는데, Querydls과 연동해서 둘의 페이징 기능을 함께 사용하는 방법이다. MemberRepositoryCustom 인터페이스에 선언을 해준다. public interface MemberRepositoryCustom { Page searchPageSimple(MemberCond condition, Pageable pageable); } Impl에 구현을 해준다. @Override public Page searchPageSimple(MemberCond condition, Pageable pageable) { QueryResults results = queryFactory .select(new QMemberTeamDto( member.id.as("..
-
스프링 데이터 JPA와 Querydsl 동시 사용JPA/Querydsl 2023. 8. 13. 19:41
스프링 데이터 JPA 리포지토리 public interface MemberRepository extends JpaRepository, MemberRepositoryCustom { // 스프링 데이터 JPA에서 메서드 이름으로 자동 쿼리 만들어줌 List findByUsername(String username); } 스프링 데이터 JPA의 인터페이스를 만든다. 쿼리명을 가지고 대부분의 기능들은 스프링 데이터 JPA에서 해결하고 특별한 쿼리만을 Querydsl로 개발하면 되니까 훨씬 간편해질 것이다. 기능 구현을 위한 인터페이스 public interface MemberRepositoryCustom { List search(MemberCond condition); } Querydsl을 이용할 때에는 따로 커..
-
Querydls 동적 쿼리 활용JPA/Querydsl 2023. 8. 13. 17:29
엔티티 및 Dto 설정을 해준 다음에 검색을 하는 동적 쿼리를 테스트가 아니라 실제로 활용해볼 것이다. @Data public class MemberTeamDto { private Long memberId; private String username; private int age; private Long teamId; private String teamName; @QueryProjection public MemberTeamDto(Long memberId, String username, int age, Long teamId, String teamName) { this.memberId = memberId; this.username = username; this.age = age; this.teamId = t..
-
Querydsl의 수정, 삭제 쿼리JPA/Querydsl 2023. 8. 13. 15:54
벌크 연산 @Test public void bulkUpdate() { long count = queryFactory .update(member) .set(member.username, "미성년자") .where(member.age.lt(23)) .execute();// 업데이트 쿼리, 반환 타입은 영향을 받은 로우 수 } member1과 member2의 이름을 미성년자라 수정하는 쿼리이다. 하지만 벌크 연산은 영속성 컨텍스트를 무시하고 바로 db를 수정하기 때문에 영속성 컨텍스트의 데이터와 db의 데이터가 달라서 충돌이 생길 수가 있다. 이 상태에서 바로 select를 하면 영속성 컨텍스트에서 데이터를 가져오기 때문에 변경되지 않는 데이터가 나온다. 벌크연산 - 영속성 컨텍스트 초기화 필요 @Test p..
-
Querydsl의 동적 쿼리JPA/Querydsl 2023. 8. 13. 15:26
동적 쿼리를 해결하는 방법 BooleanBuilder Where 다중 파라미터 사용 1. BooleanBuilder 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(); } BooleanBuilde..
-
Dto로 프로젝션 결과 반환JPA/Querydsl 2023. 8. 13. 14:55
@Test public void findDtoByJPQL() { List result = em.createQuery("select new study.querydsl.dto.MemberDto(m.username, m.age) from Member m", MemberDto.class) .getResultList(); for (MemberDto memberDto : result) { System.out.println("memberDto = " + memberDto); } } JPQL을 이용해서 Dto로 결과를 반환하려면 new 명령어를 사용해서 패키지명을 전부 다 입력해줘야지 Dto로 받아올 수 있었다. Querydsl의 빈 생성 프러퍼티 접근 필드 직접 접근 생성자 사용 1. 프로퍼티 접근 @Test pub..
-
Querydsl - Case 문JPA/Querydsl 2023. 8. 13. 00:32
기본 Case 문 @Test public void basicCase() { queryFactory .select(member.age .when(10).then("열살") .when(20).then("스무살") .otherwise("기타")) .from(member) .fetch(); } 데이터의 값에 따라 매핑을 해서 데이터를 바꿔서 받아오는 것이다. @Test public void complexCase() { List result = queryFactory .select(new CaseBuilder() .when(member.age.between(0, 20)).then("0~20살") .when(member.age.between(21, 30)).then("21~30살") .otherwise("기타"))..
-
Querydsl - 서브 쿼리JPA/Querydsl 2023. 8. 13. 00:18
서브 쿼리는 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); } .where(member.age.eq(JPAExpressions.select(mem..