본문 바로가기

JPA54

JPA - 객체지향 쿼리 언어 - Criteria 집합, 정렬, 조인 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 집합 Criteria 에서 집합(group by) 과 집합의 조건(having) 을 어떻게 사용하는지 예제를 통해 알아보자. group by 를 사용해보기 위해 기존 Member 엔티티에 age 속성을 더해주고, Address 를 함께 사용한다. Embedded 타입에 equals 와 hasCode 재정의 해 주는것도 잊지말자. @Entity public class Member extends DateMarkable{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private int age; private String name; @Embedded private Address addres.. 2021. 8. 9.
JPA - 객체지향 쿼리 언어 - Criteria - 참조: 자바 ORM 표준 JPA 프로그래밍 - Criteria Criteria 는 JPQL 의 작성을 도와주는 빌더 클래스이다. 문자열로 JPQL 을 작성하면 런타임이 되어야 문법 오류를 알 수 있지만 Criteria 는 자바 코드 기반이기 때문에 안전하게 JPQL 을 작성할 수 있다. 하지만 코드가 복잡해서 직관적으로 이해하기 힘들다는 의견도 있다. 대부분의 내용이 JPQL 과 중복되므로 사용법위주로 살펴보자. - Criteria 기초 Member member1 = new Member(); member1.setName("Name#1"); em.persist(member1); Member member2 = new Member(); member2.setName("Name#2"); em.persist(m.. 2021. 8. 4.
JPA - 객체지향 쿼리 언어 - JPQL NamedQuery - 참조: 자바 ORM 표준 JPA 프로그래밍 - Named Query 여태까지는 JPQL 예제를 작성하면서 String 변수에 JPQL 을 완성하여 수행하였다. 이를 동적 쿼리라고 한다. Mybatis 를 사용해본 경험이 있다면 보통 XML 에 특정 Query 를 선언해놓고 맵핑되는 파라미터만 변경하여 사용해본적이 있을 것이다. 이를 정적 쿼리 라고 한다. JPQL 도 XML 이나 어노테이션으로 정적 쿼리를 미리 작성해놓을 수 있다. NamedQuery 는 어플리케이션 로딩 시점에 미리 JPQL 문법을 체크하여 파싱한다. 오류 파악도 용이하며 미리 파싱한 결과를 재사용하여 성능상 이점도 있다. NamedQuery 는 @NamedQuery 어노테이션에 작성하는 방식과 XML 에 작성하는 2 가지 방식이 .. 2021. 8. 3.
JPA - 객체지향 쿼리 언어 - JPQL 다형성 쿼리 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 다형성 쿼리 앞에서 JPA 상속관계 맵핑을 배운적이 있다. Item 엔티티를 확장하여 Book, Album, Movie 엔티티를 선언하였다. Single Table 전략으로 선언했던 Item 과 Book 엔티티의 코드를 다시 한번 살펴보자. @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "ITEM_TYPE") public abstract class Item extends DateMarkable { @Id @GeneratedValue @Column(name = "ITEM_ID") private Long id; private String name.. 2021. 8. 3.
JPA - 객체지향 쿼리 언어 - JPQL 서브쿼리, 조건식 - 참조: 자바 ORM 표준 JPA 프로그래밍 - JPQL: https://docs.oracle.com/html/E13946_04/ejb3_langref.html - 서브 쿼리 JPQL 도 SQL 처럼 서브 쿼리를 지원한다. 다만 SQL 처럼 SELECT, FROM, WHERE, HAVING 절에 쓸 수 있는것은 아니고 WHERE 와 HAVING 절에서만 쓸 수 있다. 하이버네이트 HQL 은 SELECT 절의 서브쿼리를 허용하며 일부 JPA 구현체는 FROM 절의 서브쿼리도 지원하므로 자신이 사용할 구현체의 스펙을 잘 알아보고 사용하도록 하자. SQL 의 기본적인 문법은 다루지 않는다. JPQL 의 특성을 이용한 문법을 사용해보자. Member member = new Member(); member.set.. 2021. 8. 3.
JPA - 객체지향 쿼리 언어 - JPQL 경로 표현식 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 경로 표현식 경로 표현식이라는것은 쉽게 얘기해 . 을 찍어 객체 그래프를 탐색하는것을 말한다. String jpql = "select m.name, o, a " + "from Member m " + "inner join m.orders o " + "inner join m.address a " + "where m.name = :username"; List members = em.createQuery(jpql) .setParameter("username", "User#1") .getResultList(); 위와 같은 JPQL 이 있다고 할 때 m.name, m.orders, m.address 모두 경로표현식을 이용한 것이라고 말할 수 있다. 경로 표현식은 종.. 2021. 8. 2.
JPA - 객체지향 쿼리 언어 - JPQL Fetch Join - 참조: 자바 ORM 표준 JPA 프로그래밍 - 페치 조인(Fetch Join) 페치 조인은 SQL 에서 이야기하는 조인의 종류를 말하는것은 아니다. 이전에 지연 로딩에 대해서 알아본적이 있는지 지연 로딩과 관련된 얘기이며 성능 최적화를 위해 제공하는 기능이다. 문법이 크게 어렵지는 않다. [ INNER | LEFT [OUTER] ] JOIN FETCH 와 같이 기존 Join 문법 뒤에 FETCH 를 붙여주기만 하면 된다. - 엔티티 페치 조인 앞에서 User#1 과 주문 2 건을 사용하던 예제를 계속 사용해보자. Order 에서 Member 엔티티 @ManyToOne 맵핑시 FetchType 은 Lazy 라고 가정한다. 이전에 INNER JOIN 을 이용하여 Order 와 Member 엔티티를 Joi.. 2021. 7. 31.
JPA - 객체지향 쿼리 언어 - JPQL Join - 참조: 자바 ORM 표준 JPA 프로그래밍 - 내부 조인(INNER JOIN) JPQL 조인은 SQL 조인과 기능은 같지만 문법이 약간 다르다. Join 예제를 실행해보기 위해 실전예제에서 사용한 1 : N 관계인 Member 와 Order 엔티티를 사용해보자. @Entity public class Member extends DateMarkable{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List orders = new ArrayList(); ......... 2021. 7. 31.
JPA - 객체지향 쿼리 언어 - JPQL Paging, 집합, 정렬 - 참조: 자바 ORM 표준 JPA 프로그래밍 - PostgreSQL limit offset: https://www.postgresql.org/docs/12/queries-limit.html - 페이징 API 다양한 데이터베이스에서 개발해본 사람이라면 알겠지만 페이징 SQL 작성은 데이터베이스마다 구문을 다르게 작성해주어야하고 반복되는 일이 많아 번거롭다. JPA 는 페이징에 대한 API 를 제공한다. setFirstResult(int startPosition): 조회 시작 위치(0부터 시작) setMaxResults(int maxResult): 조회할 데이터 수 String jpql = "select m from Member m order by m.name asc"; List members = em.c.. 2021. 7. 29.
JPA - 객체지향 쿼리 언어 - JPQL 기본 - 참조: 자바 ORM 표준 JPA 프로그래밍 - JPQL 개요 에서 엔티티를 조회하는 많은 방법들을 간단하게 살펴보았지만 어쨌든 출발점은 JPQL 이다. 이번 절에서는 JPQL 의 기본 사용법을 알아보자. 우선 JPQL 의 기본사항 부터 확인하고 넘어가도록 하자. JPQL 은 SQL 이 아니라 객체 지향 쿼리 언어이다. 테이블을 대상으로 조회하는것이 아니다. JPQL 은 특정 데이터베이스에 의존하지 않는다. JPQL 은 결국 SQL 로 변환된다. - 기본 문법 JPQL 도 SQL 과 비슷하게 SELECT, UPDATE, DELETE 를 사용할 수 있다. 엔티티 저장시에는 persist() 를 이용하므로 INSERT 문은 존재하지 않는다. SELECT 문은 이미 살펴본적이 있다. String jpql =.. 2021. 7. 29.