목록JPA (14)
DOing
🌱 JPQL : Java Persistence Query Language : JPA에서 제공하는 쿼리방법 중 하나이다. : SQL을 추상화한 객체지향쿼리 언어이다. : SQL은 데이터베이스 테이블을 대상으로 쿼리를 작성하고, JPQL은 엔티티 객체를 대상으로 쿼리를 작성한다. : JPQL은 결국 SQL로 번역되어 실행된다. : JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. 🌱 JPQL 문법 select m from Member as m where m.age > 18 엔터티와 속성은 대소문자를 구분하지만 JPQL 키워드는 대소문자를 구분하지 않는다. 테이블 이름이 아닌 엔티티 이름(Member)을 사용한다. 별칭(m)은 필수이다. as는 생략가능하다. 프로젝션 : select절..
🌱 Fetch Join SQL 조인 종류가 아닌, JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 기능이다. [LEFT | INNER ] JOIN FETCH [JPQL] select m from Member m join fetch m.team [SQL] select m.*, t.* from member m inner join team t on m.team_id = t.id 🌱 OneToMany + Fetch Join 시 주의! String jpql = "select t from Team t join fetch t.members where t.name = '팀A'" List teams = em.createQuery(jpql, Team.class).g..
프로젝션 : select 대상지정하는 일 프로젝션 대상이 두개 이상이라면 튜플이나 DTO로 조회해야한다. 🌱 튜플 사용하기 com.querydsl.core.Tuple를 사용하고 있다. 때문에 Repository 계층을 넘어서 Service나 Controller계층에 넘어가는 것은 좋지않은 설계다. Service나 Controller계층에 넘어갈때는 DTO로 넘어가는 것이 좋다고 생각한다. List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String username = tuple.get(member.username); Integer age = tu..
서브쿼리 : 쿼리안의 쿼리 : com.querydsl.jpa.JPAExpressions 사용(이를 static import로 해서 깔끔하게 정리가능!) : where절 뿐만아니라 select절에도 가능하다. @Test public void subQuery() throws Exception { QMember memberSub = new QMember("memberSub"); List result = queryFactory .selectFrom(member) .where(member.age.eq( JPAExpressions .select(memberSub.age.max()) .from(memberSub) // member 테이블 다시 조회 )) .fetch(); // in 서브쿼리 List result = ..
🍀 Join : join(조인 대상, 별칭) 과 같은 형식을 가지면 된다. : 지원하는 Join의 종류 join() , innerJoin() : 내부 조인(inner join) leftJoin() : left 외부 조인(left outer join) rightJoin() : rigth 외부 조인(rigth outer join) 🍀 내부 조인(inner join) 내부 조인(inner join)의 경우, on 절을 활용해 조인 대상을 필터링 하는 것과where 절에서 필터링 하는 것과 기능이 동일하다!!! @Test public void join() throws Exception { QMember member = QMember.member; QTeam team = QTeam.team; List result..
🌱 정렬 : orderBy이용 @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(); Member member5 = result.get(0); Member member6 = result.get(1); Member memberNull = result.g..
Querydsl 검색 조건 활용 @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"); } Querydsl 검색 조건 member.username.eq("member1") // username = 'member1' member.username.ne("member1") //username != 'member1' member.username.eq("member1").not() // ..
🌱 Querydsl? 쿼리를 자바코드로 작성할 수 있게 도와주는 기술이다. Spring Data JPA로 해결하지 못하는 복잡한 쿼리/동적 쿼리를 해결할 수 있다. 자바코드로 작성하기 때문에 문법오류를 컴파일 시점에 잡아낼 수 있다. 🌱 build.gradle에서 Querydsl 설정 plugins { id 'org.springframework.boot' version '2.5.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' } group = 'com.example' version = '0.0.1..