본문 바로가기

Spring/Querydsl

(9)
Querydsl- 벌크 연산 @Test // member.age가 28보다 적은 member.username을 "비회원"으로 update public void bulkUpdate() throws Exception{ // member1 = 10 -> 비회원 // member2 = 20 -> 비회원 // member3 = 30 -> 유지 // member4 = 40 -> 유지 long count = queryFactory .update(member) .set(member.username, "비회원") //조건을 만족하는 member의 username이 "비회원" .where(member.age.lt(28)) .execute(); // 안 해주면 영속성 컨텍스트에서 데이터 가져와서 업데이트된 DB의 값을 가져오지 못함 // em.flus..
Querydsl- 동적쿼리 BooleanBuilder querydsl에서는 BooleanBuilder 객체를 이용해서 동적 쿼리를 발생시킬 수 있다. 예를 들어 Member 엔티티를 조회하되, 해당 엔티티의 이름과 나이로 조회를 하는 메서드를 구현한다고 하자. @Test public void dynamicQuery_BooleanBuilder() throws Exception{ String usernameParam = "member1"; Integer ageParam = 10; // searchMember1: // 1) 인자가 모두 들어간 경우 두 조건을 모두 만족하는 엔티티 조회 // 2) 인자가 1개만 들어간 경우(나머지는 null인 경우) 들어간 조건으로만 엔티티 조회 // 3) 인자가 모두 null인 경우, 조건 없이 모두 ..
Querydsl- 프로젝션 프로젝션 프로젝션이란 select절로 조회할 대상을 지정하는 것을 의미한다. 예컨데 querydsl에서는 프로젝션 대상이 하나인 경우 단일 타입으로 반환을 하게된다. 프로젝션 대상이 하나인 경우 List result = queryFactory .select(member.username) .from(member) .fetch(); 반면에 프로젝션 대상이 여러개인 경우 튜플이나 DTO를 통해서 조회하게 된다. 프로젝션 대상이 여러개인 경우 List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String username = tuple.get(member...
Querydsl- 조인 @Test public void join() throws Exception{ List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); for (Member m : result) { assertThat(m.getTeam().getName()).isEqualTo("teamA"); } } /** * 세타 조인 * 회원의 이름이 팀 이름과 같은 회원 조회 */ @Test public void theta_join() throws Exception{ // 세타조인 예제를 위한 엔티티 em.persist(new Member("teamA")); em.persist(new Mem..
Querydsl- 집합 @Test public void aggregation() { /* * JPQL * select * Count(m), * Sum(m.age), * Avg(m.age), * Max(m.age), * Min(m.age) * from Member m * */ // Tuple: 다양한 데이터 셋을 저장 가능 Tuple tuple = queryFactory .select( member.count(), member.age.sum(), member.age.avg(), member.age.max(), member.age.min() ) .from(member) .fetchOne(); // Tuple의 데이터를 get() 메서드를 이용해서 조회가능 assertThat(tuple.get(member.count())).isEq..
Querydsl- 정렬과 페이징 예시 초기 조건 package study.querydsl; @SpringBootTest @Transactional public class QuerydslBasicTest { @Autowired EntityManager em; JPAQueryFactory queryFactory; @BeforeEach //각 테스트마다 데이터 주입 public void each(){ queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); ..
Querydsl- Q 인스턴스 Q 인스턴스 사용법 2 가지 QMember member = new QMember("m") // 별칭 직접 지정 QMember member = QMember.member // 기본 인스턴스 사용 일반적으로 기본 인스턴스를 주로 사용한다. 기본 인스턴스와 static import를 사용하면 훨씬 sql 느낌이 나는 직관적인 코드를 작성할 수 있다. 예시 (기본 인스턴스 + static import) package study.querydsl; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import org.assertj.core.api.Assertions; import org.junit.jupiter.a..
Querydsl- Jpql과 Querydsl 비교 JpaQueryFactory public class QuerydslStudy{ @Autowired private EntityManager em; // JpaQueryFacotry 생성 JpaQueryFactory queryFactory = new JpaQueryFactory(em); 인자로 EntityManager를 받음 } 기본적으로 JPQL을 사용하기 위해서는 EntityManager가 필요한 것 처럼, Querydsl을 사용하기 위해서는 JpaQueryFacotry가 필요하다. JpaQueryFactory를 선언하기 위한 방법은 위와 같다. 테스트 코드로 JPQL과 Querydsl 비교하기 package study.querydsl; import com.querydsl.jpa.impl.JPAQuery..