공부/JPA

공부/JPA

Query DSL - 정렬, 페이징, 집합

Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 정렬 정렬 기준은 다음과 같다. 회원 나이 내림차순(desc) 회원 이름 오름차순(asc) 단, 회원 이름이 없으면 마지막에 출력한다. @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.usern..

공부/JPA

Query DSL - 결과 조회

Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 결과 조회 fetch() : List 조회, 데이터가 없으면 빈 List 반환 fetchOne() : 단 건 조회 결과가 없으면 : null 결과가 둘 이상이면 : NonUniqueResultException 발생 fetchFirst() : limit(1).fetchOne() fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행 fetchCount() : count 쿼리로 쿼리 변경해서 count 수 조회 fetchResults fetch, fetchOne, fetchFirst의 경우는 굳이 실행 안해봐도 어떻게 나오는지 알테니 fetchResults부터..

공부/JPA

Query DSL - 검색 조건 쿼리

Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 검색 조건 쿼리 코드로 먼저 확인해보자. @Test public void search() { Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1") .and(member.age.eq(10))) // .where(member.username.eq("member1"), member.age.eq(10)) 와 동일 .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("member1"); } .select와 .from의 경우는 .selec..

공부/JPA

QueryDSL - 기본 Q-Type 활용

Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 기본 Q-Type 활용 Q 클래스 인스턴스를 사용하는 방법 별칭 직접 지정 QMember qMember = new QMember("m"); 기본 인스턴스 사용 QMember qMember = QMember.member; 기본 인스턴스는 QMember 클래스 파일에 가보면 아래 코드로 만들어져 있는 걸 확인할 수 있다. public static final QMember member = new QMember("member1"); 저번에 작성한 테스트 코드에 적용해보자. //QMember m = new QMember("m"); // 별칭 주는 방법 QMember m = QMember.membe..

공부/JPA

Query DSL - JPQL vs QueryDSL

Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. JPQL vs QueryDSL 엔티티 찾기 JPQL로 엔티티 하나를 찾아오려면 아래와 같이 작성하면 된다. @Test public void startJPQL() { // member1 찾기 String qlString = "select m from Member m where m.username=:username"; Member findMember = em.createQuery(qlString, Member.class) .setParameter("username", "member1") .getSingleResult(); assertThat(findMember.getUsername()).is..

공부/JPA

Query DSL - 예제 도메인 모델

Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 예제 도메인 모델 예제는 익숙하고도 간단한 Member와 Team이다. Member의 컬럼은 id, username, age, team이 있고 Team의 컬럼은 id, name, members가 있다. 둘의 연관 관계는 Member의 입장에서 보면 Member와 Team은 다대일이고, Team의 입장에서 보면 Team과 Member는 일대다이다. Member 클래스 어노테이션 @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of={"id", "username", "age"}) publi..

공부/JPA

Query DSL - 스프링 부트 설정

Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 스프링 부트 설정 application.yml 생성 및 설정 src/resources에 있던 application.properties 파일을 지우고 application.yml 파일을 생성 후 아래 코드를 작성한다. spring: datasource: url: jdbc:h2:tcp://localhost/~/querydsl username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true loggi..

공부/JPA

Query DSL - Query DSL 설정과 검증

Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. Query DSL 설정과 검증 build.gradle 설정 build.grable에 Query DSL 라이브러리 및 설정 추가 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' // querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' } group = 's..

공부/JPA

Query DSL - 프로젝트 환경설정

Query DSL게시글은 대부분 인프런의 김영한님의 강의인 '실전! Query DSL' 기반으로 내용을 정리했습니다. 프로젝트 환경 설정(springboot 2.7.2 기준) https://start.spring.io/ Build and run 설정 - IntelliJ IDEA로 변경 HelloController.class 생성 @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "hello!"; } } 확인 lombok 설정 - install lombok 설정 - Enable annotation processing

공부/JPA

Spring Data JPA - 네이티브 쿼리

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 네이티브 쿼리 네이티브 쿼리는 JPA에서 제공하는 기능이며 일반적으로 우리가 사용하는 SQL을 사용할 수 있도록 해주는 기능이다. 가급적 네이티브 쿼리는 사용하지 않는 것이 좋다. 정말 최후의 수단으로.. 어쩔 수 없는 상황에만 사용하는 걸 권장한다. 스프링 데이터 JPA 기반 네이티브 쿼리 MemberRepository.interface @Query(value = "select * from member where username = ?", nativeQuery = true) Member findByNativeQuery(String username); MemberRepos..

공부/JPA

Spring Data JPA - Projections

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Projections 이 기능은 약간의 도움이 될 때가 있어 앞 부분보다는 잘 듣는 게 좋다. 엔티티 대신에 DTO를 편리하게 조회할 때 사용한다. 예를 들면 Member 엔티티가 아니라 Member의 이름만 조회하고 싶을 때 유용하다. 인터페이스 기반의 Closed Projections UsernameOnly.interface public interface UsernameOnly { String getUsername(); } MemberRespository.interface List findProjectionsByUsername(@Param("username") Stri..

공부/JPA

Spring Data JPA - Query By Example

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. Query By Example Query By Example은 쿼리를 Example에 의해서 하겠다는 기능이다. 코드로 살펴보자. @Test public void queryByExample() { Team teamA = new Team("teamA"); em.persist(teamA); Member m1 = new Member("m1", 0, teamA); Member m2 = new Member("m2", 0, teamA); em.persist(m1); em.persist(m2); em.flush(); em.clear(); //Probe Member member = ne..

공부/JPA

Spring Data JPA - Specifications(명세)

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 나머지 기능들 Specifications(명세) Query By Example Projections 네이티브 쿼리 나머지 기능들은 복잡도가 높지만 실무에서 그닥 필요하지는 않은 기능들이다. 그래도 개 똥도 약에 쓰려면 없다고, 알고 있으면 좋을 기능들이므로 이런 게 있구나 정도만 파악하면 될 것 같다. Specifications(명세) 스프링 데이터 JPA는 JPA Criteria를 활용해서 이 개념을 사용할 수 있도록 지원한다. Criteria 앞에서 자주 좀 본 기능 같다. 하지만 기억에 잘 안 남는 거 보니 그다지 중요한 애는 아닌 거 같다. 강의에서도 말하길 이 기..

공부/JPA

Spring Data JPA - 새로운 엔티티를 구별하는 방법

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 새로운 엔티티를 구별하는 방법 새로운 엔티티를 판단하는 기본 전략 식별자가 객체일 때 null로 판단 식별자가 자바 기본 타입일 때 0으로 판단 private long id; 일 때 long에는 null이 들어갈 수 없으니 0이 들어간다. Persistable 인터페이스를 구현해서 판단 로직 변경이 가능하다. Item.class @Entity @Getter public class Item { @Id @GeneratedValue private Long id; } ItemRepository.interface public interface ItemRepository extend..

공부/JPA

Spring Data JPA - 스프링 데이터 JPA 구현체 분석

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA가 내부적으로 어떻게 동작하는지 알아보기 위해 구현체를 분석해보자. 구현체는 JpaRepository 인터페이스에 인터페이스 선언부 옆에 화살표 아래 버튼을 누르면 SimpleJpaRepository를 찾을 수 있다. @Repository @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepositoryImplementation { //...생략 @Override public Optional findById(ID id) { A..

데부한
'공부/JPA' 카테고리의 글 목록