Spring Data JPA - JPA NamedQuery
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. JPA NamedQuery 쿼리 메서드 기능 3가지 메서드 이름으로 쿼리 생성 메서드 이름으로 JPA NamedQuery 호출 @Query 애노테이션을 사용해서 레파지토리 인터페이스에 쿼리 직접 정의 JPA NamedQuery @NamedQuery 애노테이션으로 Named 쿼리 정의 실무에서 거의 사용할 일이 없다. JPA를 직접 사용해서 Named 쿼리 호출 관련 포스팅 JPA 객체지향 쿼리 언어(JPQL) - Named 쿼리 JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. Named 쿼리 정적 쿼리..
Spring Data JPA - 메서드 이름으로 쿼리 생성
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 메서드 이름으로 쿼리 생성 쿼리 메서드 기능 3가지 메서드 이름으로 쿼리 생성 메서드 이름으로 JPA NamedQuery 호출 @Query 애노테이션을 사용해서 레파지토리 인터페이스에 쿼리 직접 정의 메서드 이름으로 쿼리 생성 메서드 이름을 분석해서 JPQL 쿼리 실행 ex) 이름과 나이가 같은 회원을 조회하려면? 순수 JPA 리포지토리 public List findByUsernameAndAgeGreaterThen(String username, int age) { return em.createQuery("select m from Member m where m where m..
Spring Data JPA - 공통 인터페이스
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 공통 인터페이스 설정 원래는 스프링에서는 JavaConfig로 설정해야한다. @SpringBootApplication @EnableJpaRepositories(basePackages = "study.datajpa.repository") public class DataJpaApplication { public static void main(String[] args) { SpringApplication.run(DataJpaApplication.class, args); } } 스프링 부트에서는 다행히도 생략이 가능하며 @SpringBootApplication가 적용된 파일의 패..
Spring Data JPA - 순수 JPA 기반 리포지토리 만들기
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 순수 JPA 기반 리포지토리 만들기 CRUD 기능 만들기 MemberJpaRepository.class @Repository public class MemberJpaRepository { @PersistenceContext private EntityManager em; public Member save(Member member) { em.persist(member); return member; } public void delete(Member member) { em.remove(member); } public List findAll() { return em.createQu..
Spring Data JPA - 예제 도메인 모델과 동작확인
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 예제 도메인 모델과 동작확인 여러 개의 멤버가 하나의 팀에 소속될 수 있다. (다대일) 하나의 팀에는 여러 명의 멤버가 소속될 수 있다. (일대다) ERD에서 외래키는 다(N)쪽인 멤버에게 만들어진다. Member.class @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) public class Member { @Id @GeneratedValue @Column(name = "member_id") private Lo..
Spring Data JPA - 프로젝트 환경 설정
·
공부/JPA
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다. 프로젝트 환경 설정 https://start.spring.io/ Project : Gradle Project Language : Java Spring Boot : (22.07.24 기준) 2.7.2 Group : study Artifact : data-jpa Java : 11 (강의에서는 딱히 선택하는 부분이 나오지 않았지만 일단 나는 11을 선택했다.) Dependencies Spring Web Spring Data JPA H2 Database Lombok HelloController 테스트로 컨트롤러를 하나 만들어서 잘 매핑되는지 확인 @RestController pu..
JPA 객체지향 쿼리 언어(JPQL) - 벌크 연산
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 벌크 연산 벌크 연산 : 일반적으로 잘 알고있는 SQL의 UPDTAE, DELETE 재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면? JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행 재고가 10개 미만인 상품을 리스트로 조회 상품 엔티티의 가격을 10% 증가 트랜잭션 커밋 시점에 변경감지 동작 변경된 데이터가 100건이라면 100번의 UPDATE SQL이 실행 예제 쿼리 한 번으로 여러 테이블 로우를 변경(엔티티) executeUpdate()의 결과는 영향받은 엔티티 수 반환 UPDATE, DELETE 지원 INSERT(insert into ...select, 하..
JPA 객체지향 쿼리 언어(JPQL) - Named 쿼리
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. Named 쿼리 정적 쿼리 미리 정의해서 이름을 부여해두고 사용하는 JPQL 정적 쿼리만 가능함 애노테이션, XML에 정의 애플리케이션 로딩 시점에 초기화 후 재사용 애플리케이션 로딩 시점에 쿼리를 검증 애노테이션 Member 클래스에 @NamedQuery 애노테이션을 추가해준다. name의 경우 Member를 붙여도 되고 안 붙여도 되지만 관례는 붙이는 것이므로 큰 이유가 없는 이상 붙이는 게 좋다. @NamedQuery( name = "Member.findByUsername", query = "select m from Member m where m.username = :usernam..
JPA 객체지향 쿼리 언어(JPQL) - 엔티티 직접 사용
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 엔티티 직접 사용 기본 키 값 JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용 JPQL select count(m.id) from Member m // 엔티티의 아이디를 사용 select count(m) from Member m // 엔티티를 직접 사용 SQL(JPQL 둘 다 다음과 같은 SQL 실행) select count(m.id) as cnt from Member m 엔티티를 파라미터로 전달 String query = "select m From Member m where m = :member"; Member findMember = em.createQ..
JPA 객체지향 쿼리 언어(JPQL) - 다형성 쿼리
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 다형성 쿼리 조회 대상을 특정 자식으로 한정 ex) Item 중에 Book, Movie를 조회해라 JPQL select i from Item i where type(i) IN (Book, Movie) SQL select i from i where i.DTYPE in ('B', 'M') TREAT(JPA 2.1) 자바의 타입 캐스팅과 유사함 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용 FROM, WHERE, SELECT(하이버네이트 지원) 사용 ex) 부모인 Item과 자식 Book이 있다. JPQL select i from Item i where treat(i as Bo..
JPA 객체지향 쿼리 언어(JPQL) - 패치 조인(한계)
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 패치 조인(한계) 패치 조인의 특징과 한계 패치 조인 대상에는 별칭을 줄 수 없다. 하이버네이트는 가능하지만 가급적 사용하지 않는 것이 좋다. 패치 조인은 기본적으로 엔티티와 연관 된 데이터를 모두 가져온다. 그 중에 where절을 이용해 몇 개만 가져오고 싶을 때는 그냥 따로 조회하는 것이 좋다. 예를들면 1개의 팀과 연관된 회원이 5명이라고 치고, 그 중에 한 명만 불러오는 경우엔 잘못 조작하게 되면 나머지 4명이 누락되어 이상하게 동작할 수 있는 확률이 있다. 그리고 기본적으로 객체 그래프라는 것은 모든 데이터를 조회할 수 있어야하는게 정상이다. 그런데 일정 데이터만 걸러서 조회하..
JPA 객체지향 쿼리 언어(JPQL) - 패치 조인(기본)
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 패치(fetch) 조인 1 - 기본 정말 중요한 부분이므로 집중 필수! SQL 조인 종류가 아니고 JPQL의 기능 중 하나이다. JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다. 두 번 쿼리가 나갈 것을 쿼리가 한 번만 나가도록 하는 기능. join fetch 명렁어 사용 패치 조인 ::= [LEFT [OUTER] | INNER] JOIN FETCH 조인경로 엔티티 패치 조인 회원을 조회하면서 연관된 팀도 함께 조회(SQL 한 번에) SQL을 보면 회원뿐만 아니라 팀(T.*)도 함께 SELECT JPQL select m f..
JPA 객체지향 쿼리 언어(JPQL) - 경로 표현식
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 경로 표현식 .(점)을 찍어 객체 그래프를 탐색하는 것 select m.username // 상태 필드 from Member m join m.team t // 단일 값 연관 필드 join m.orders o // 컬렉션 값 연관 필드 where t.name = "팀A" 위 세 가지 각자 내부적으로 동작하는 방식이 달라지므로 구분을 잘해서 이해해야 한다. 상태 필드(state field) : 단순히 값을 저장하기 위한 필드 연관 필드(association field) : 연관관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 컬렉션 값 연관 필..
JPA 객체지향 쿼리 언어(JPQL) - JPQL 함수
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. JPQL 함수 JPQL 기본 함수 JPQL이 제공하는 표준 함수이다. DB와 상관없이 그냥 사용하면 된다. CONCAT : 문자열을 이어주는(더하는) 함수 String query = "select concat('a', 'b') from Member m "; // 출력 로그 Hibernate: /* select concat('a', 'b') from Member m */ select ('a'||'b') as col_0_0_ from Member member0_ s = ab //** a와 b가 이어져서 출력된다. concat 같은 경우는 하이버네이트에서 || 으로도 지원한다. String ..
JPA 객체지향 쿼리 언어(JPQL) - 조건식(CASE 등)
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 조건식(CASE 등) 기본 CASE 식 select case when m.age = 60 then '경로요금' else '일반요금' end from Member m 기본 CASE 식은 컨디션에 대한 조건을 넣을 수 있는 CASE 식이다. 위의 예제를 인텔리제이에서 적어보면 아래와 같다. String query = "select " + "case when m.age = 60 then '경로요금' " + " else '일반요금' " + "end " + "from Member m"; List resultList = em.createQuery(query, String.class).getResu..