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..
JPA 객체지향 쿼리 언어(JPQL) - JPQL 타입 표현과 기타식
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. JPQL 타입 표현과 기타식 JPQL 타입 표현 문자 : 'HELLO', 문자 내 싱글 쿼테이션(')을 표시하고 싶을 경우 싱글 쿼테이션을 두 개 써주면 된다. → 'She''s' 숫자 : 10L(Long), 10D(Double), 10F(Float) Boolean : TRUE, FALSE ENUM : jpabook.MemberType.Admin (패키지명 포함) 엔티티 타입 : TYPE(m) = Member (상속 관계에서 사용) 예제 String query = "select m.username, 'HELLO', TRUE from Member m"; 위와 같이 쿼리를 만들면 각각의 값..
JPA 객체지향 쿼리 언어(JPQL) - 서브 쿼리
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 서브 쿼리 일반적인 SQL에서의 서브쿼리와 똑같다. 나이가 평균보다 많은 회원 select m from Member m where m.age > (select avg(m2.age) from Member m2) 상위에서 조회한 Member m을 서브쿼리(괄호 부분)까지 끌고 오지 않았다. 이런 식으로 작성해야 성능에 더 좋으니 참고하자. 한 건이라도 주문한 고객 select m from Member m where (select count(o) from Order o where m = o.member) > 0 위 예제는 상위에서 조회한 Member m을 서브쿼리까지 끌고왔다. 이런 경우에는..
JPA 객체지향 쿼리 언어(JPQL) - 조인(JOIN)
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 조인(JOIN) 내부 조인(INNER JOIN) SELECT m FROM Member m [INNER] JOIN m.team t JPQL 조인은 엔티티 중심으로 동작을 한다. Member와 연관있는 Team을 m.team과 같이 점(.)으로 표현하고, 별칭을 t로 준다. 참고로 내부 조인은 Member는 있는데 team 데이터가 없을 경우에 Member만 나온다. // 실행 클래스 for(int i = 0; i < 100; i++) { Team team = new Team(); team.setName("teamA"); em.persist(team); Member member = new ..
JPA 객체지향 쿼리 언어(JPQL) - 페이징 API
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 페이징 API JPA는 페이징을 다음 두 API로 추상화한다. setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작) setMaxResult(int maxResult) : 조회할 데이터 수 setFirstResult()와 setMaxResult()는 다음과 같이 사용하면 된다. List result = em.createQuery("select m from Member m order by m.age desc", Member.class) .setFirstResult(0) .setMaxResults(10) .getResultList(); 그리고 테스트..
JPA 객체지향 쿼리 언어(JPQL) - 프로젝션(SELECT)
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 프로젝션(SELECT) SELECT 절에 조회할 대상을 지정하는 것 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입) SELECT m FROM Member m → 엔티티 프로젝션 Member member = new Member(); member.setUsername("member1"); member.setAge(10); em.persist(member); List result = em.createQuery("select m from Member m", Member.class) .getResultList(); 일반적인 조회 방법은 여태 써왔던 방식..
JPA 객체지향 쿼리 언어(JPQL) - 기본 문법과 쿼리 API
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 기본 문법과 쿼리 API JPQL? Java Persistence Query Language JPQL JPQL은 객체지향 쿼리 언어. 따라서 테이블이 아닌 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. → 방언 JPQL은 결국 SQL로 변환이 된다. (매핑 정보 + 방언 = SQL) 프로젝트 새로 생성 후 Member.class @Entity public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @M..
JPA 객체지향 쿼리 언어 - JPQL, QueryDSL 등 소개
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 객체지향 쿼리 언어(JPQL) JPA는 다양한 쿼리 방법 지원 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색 나이가 18살 이상인 회원을 모두 검색하고 싶다면? 이런 경우에는 em.find()로 가져올 수가 없다. JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 애..
JPA 값 타입 - 값 타입 컬렉션
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 값 타입 컬렉션 값 타입을 컬렉션에 담아서 쓰는 걸 값 타입 컬렉션이라 한다. 값 타입 컬렉션에서 문제는 DB 테이블과 매핑할 때가 문제이다. DB 테이블에는 컬렉션을 담을 수 있는 방법이 없다. 컬렉션은 개념적으로 1대다이기 때문에 별도의 테이블로 뽑아줘야 한다. 예제 Member.class @ElementCollection @CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID")) @Column(name = "FOOD_NAME") // 예외적으로 해주는 것. private Set fav..
JPA 값 타입 - 값 타입의 비교
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 값 타입의 비교 값 타입 : 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 한다. // 같다. int a = 10; int b = 10; // 다르다. Address a = new Address("서울시"); Address b = new Address("서울시"); 그런데 객체의 경우엔 == 비교 시 false가 반환된다. 왜나햐면 JAVA에서는 == 비교 시 참조 값을 비교하게 되는데 a와 b는 각각 다른 참조 값을 갖고 있기 때문에 false가 반환된다. 동일성(identity) 비교 : 인스턴스의 참조 값을 비교, == 사용 동등성(equivalence) 비교 : 인스턴..
JPA 값 타입 - 값 타입과 불변 객체
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 값 타입과 불변 객체 값 타입 공유 참조 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다. 부작용(side effect) 발생 위의 그림처럼 city 값을 NewCity로 변경하면 회원1과 2가 들고 있던 city도 NewCity로 변경된다. Address address = new Address("city", "street", "100"); Member member1 = new Member(); member1.setUsername("member1"); member1.setHomeAddress(address); // 같은 address 공유 em.persist(member..
JPA 값 타입 - 임베디드 타입
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 임베디드 타입(복합 값 타입) 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입(embedded type)이라 함 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함 int, String과 같은 타입 → 추적 불가능 예제(회원) 회원은 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다. 회원 엔티티를 보면 몇 개의 필드를 하나로 합쳐 공통화 할 수 있는 부분들이 보인다. workPeriod : startDate + endDate homeAddress : city + street + zipcode 뭔가 어려워보이지만 그냥 공통화 할..
JPA 값 타입 - 기본값 타입
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 기본값 타입 JPA 의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자(id)로 인식이 가능한 것 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체, 100 -> 200으로 변경되었으면 200이란 값이 과거에 어떤 값이었었는지 추적이 불가능하다. 기본값 타입 자바 기본 타입(int, double) 래퍼 클래스(Inte..
JPA 프록시와 연관관계 - 영속성 전이(CASCADE)와 고아 객체
·
공부/JPA
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. 영속성 전이(CASCADE)와 고아 객체 영속성 전이 : CASCADE 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 부모가 em.persist()를 날리면 자식까지 모두 자동으로 함께 저장되는 기능 부모와 연관된 자식들을 한 번에 영속성 컨텍스트에 저장하고 싶은 경우 사용한다. 예제 Parent.class @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent") private List chi..