JPQL 기본 함수
2022. 7. 8. 21:46
JPA
1. JPQL 기본 함수 • CONCAT • SUBSTRING • TRIM • LOWER, UPPER • LENGTH • LOCATE • ABS, SQRT, MOD • SIZE, INDEX(JPA 용도) 2. 사용자 정의 함수 호출 • 하이버네이트는 사용전 방언에 추가해야 한다. • 사용하는 DB 방언을 상속받고, 사용자 정의 함수를 등록한다. 출처 : 김영한, 자바 ORM 표준 JPA 프로그래밍 - 기본편
조건식 - CASE 식
2022. 7. 8. 19:00
JPA
1. 조건식 - CASE 식 • COALESCE: 하나씩 조회해서 null이 아니면 반환 • NULLIF: 두 값이 같으면 null 반환, 다르면 첫번째 값 반환 출처 : 김영한, 자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL 타입 표현
2022. 7. 8. 17:38
JPA
1. JPQL 타입 표현 • 문자: ‘HELLO’, ‘She’’s’ • 숫자: 10L(Long), 10D(Double), 10F(Float) • Boolean: TRUE, FALSE • ENUM: jpabook.MemberType.Admin (패키지명 포함) • 엔티티 타입: TYPE(m) = Member (상속 관계에서 사용) 2. JPQL 기타 • SQL과 문법이 같은 식 • EXISTS, IN • AND, OR, NOT • =, >, >=,
서브 쿼리
2022. 7. 8. 16:09
JPA
1. 서브 쿼리 • 나이가 평균보다 많은 회원 select m from Member m where m.age > (select avg(m2.age) from Member m2) • 한 건이라도 주문한 고객 select m from Member m where (select count(o) from Order o where m = o.member) > 0 2. 서브 쿼리 지원 함수 • [NOT] EXISTS (subquery): 서브쿼리에 결과가 존재하면 참 • {ALL | ANY | SOME} (subquery) • ALL 모두 만족하면 참 • ANY, SOME: 같은 의미, 조건을 하나라도 만족하면 참 • [NOT] IN (subquery): 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참 3. 서브 ..
조인
2022. 7. 8. 15:52
JPA
1. 조인 • 내부 조인: SELECT m FROM Member m [INNER] JOIN m.team t • 외부 조인: SELECT m FROM Member m LEFT [OUTER] JOIN m.team t • 세타 조인: select count(m) from Member m, Team t where m.username = t.name 2. 조인 - ON 절 • ON절을 활용한 조인(JPA 2.1부터 지원) • 1. 조인 대상 필터링 • 예) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인 JPQL: SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A' SQL: SELECT m.*, t.* FROM Member m LEFT JOIN Team..
프로젝션
2022. 7. 8. 11:25
JPA
1. 프로젝션 • SELECT 절에 조회할 대상을 지정하는 것 • 프로젝션 대상: 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자등 기본 데이터 타입) • SELECT m FROM Member m -> 엔티티 프로젝션 • SELECT m.team FROM Member m -> 엔티티 프로젝션 • SELECT m.address FROM Member m -> 임베디드 타입 프로젝션 • SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션 • DISTINCT로 중복 제거 2. 프로젝션 - 여러 값 조회 • SELECT m.username, m.age FROM Member m • 1. Query 타입으로 조회 • 2. Object[] 타입으로 조회 • 3. new 명..
JPQL(Java Persistence Query Language)
2022. 7. 8. 02:55
JPA
1. JPQL - 기본 문법과 기능 • JPQL은 객체지향 쿼리 언어다.따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. • JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다. • JPQL은 결국 SQL로 변환된다. • select m from Member as m where m.age > 18 • 엔티티와 속성은 대소문자 구분O (Member, age) • JPQL 키워드는 대소문자 구분X (SELECT, FROM, where) • 엔티티 이름 사용, 테이블 이름이 아님(Member) • 별칭은 필수(m) (as는 생략가능) 2. 집합과 정렬 • GROUP BY, HAVING • ORDER BY 3. TypeQuery, Query • TypeQuer..
JDBC 직접 사용, SpringJdbcTemplate 등
2022. 7. 8. 01:39
JPA
• JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링 JdbcTemplate, 마이바티스등을 함께 사용 가능 • 단 영속성 컨텍스트를 적절한 시점에 강제로 플러시 필요 • 예) JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 수동 플러시 출처 : 김영한, 자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL
2022. 7. 8. 00:50
JPA
1. JPQL 소개 • 가장 단순한 조회 방법 • EntityManager.find() • 객체 그래프 탐색(a.getB().getC()) • 나이가 18살 이상인 회원을 모두 검색하고 싶다면? • JPA를 사용하면 엔티티 객체를 중심으로 개발 • 문제는 검색 쿼리 • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 • SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 • JPQL은 엔티티 객체를 대상으로 쿼리 • S..
객체지향 쿼리 언어 소개
2022. 7. 7. 22:09
JPA
1. JPA는 다양한 쿼리 방법을 지원 • JPQL • JPA Criteria • QueryDSL • 네이티브 SQL • JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께사용 출처 : 김영한, 자바 ORM 표준 JPA 프로그래밍 - 기본편
값 타입 컬렉션
2022. 7. 7. 01:40
JPA
1. 값 타입 컬렉션 • 값 타입을 하나 이상 저장할 때 사용 • @ElementCollection, @CollectionTable 사용 • 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다. • 컬렉션을 저장하기 위한 별도의 테이블이 필요함 2. 값 타입 컬렉션 사용 • 값 타입 저장 예제 • 값 타입 조회 예제 - 값 타입 컬렉션도 지연 로딩 전략 사용 • 값 타입 수정 예제 • 참고: 값 타입 컬렉션은 영속성 전에(Cascade) + 고아 객체 제거 기능을 필수로 가진다고 볼 수 있다 3. 값 타입 컬렉션의 제약사항 • 값 타입은 엔티티와 다르게 식별자 개념이 없다. • 값은 변경하면 추적이 어렵다. • 값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 ..
값 타입과 불변 객체
2022. 7. 6. 14:21
JPA
1. 값 타입 공유 참조 • 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험함 • 부작용(side effect) 발생 2. 값 타입 복사 • 값 타입의 실제 인스턴스인 값을 공유하는 것은 위험 • 대신 값(인스턴스)를 복사해서 사용 3. 객체 타입의 한계 • 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있다. • 문제는 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다. • 자바 기본 타입에 값을 대입하면 값을 복사한다. • 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없다. • 객체의 공유 참조는 피할 수 없다 4. 불변 객체 • 객체 타입을 수정할 수 없게 만들면 부작용을 원천 차단 • 값 타입은 불변 객체(immut..
임베디드 타입(복합 값 타입)
2022. 7. 6. 13:03
JPA
1. 임베디드 타입 • 새로운 값 타입을 직접 정의할 수 있음 • JPA는 임베디드 타입(embedded type)이라 함 • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함 • int, String과 같은 값 타입 • 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소번지, 주소 우편번호를 가진다. • 회원 엔티티는 이름, 근무 기간, 집 주소를 가진다. 2. 임베디드 타입 사용법 • @Embeddable: 값 타입을 정의하는 곳에 표시 • @Embedded: 값 타입을 사용하는 곳에 표시 • 기본 생성자 필수 3. 임베디드 타입의 장점 • 재사용 • 높은 응집도 • Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음 • 임베디드 타..
값 타입
2022. 7. 5. 23:28
JPA
1. JPA의 데이터 타입 분류 1) 엔티티 타입 • @Entity로 정의하는 객체 • 데이터가 변해도 식별자로 지속해서 추적 가능 • 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 2) 값 타입 • int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 • 식별자가 없고 값만 있으므로 변경시 추적 불가 • 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 2. 값 타입 분류 1) 기본값 타입 • 자바 기본 타입(int, double) • 래퍼 클래스(Integer, Long) • String 2) 임베디드 타입(embedded type, 복합 값 타입) 3) 컬렉션 값 타입(collection value type) 3. 기본값 타입 • ..