JPA(26)
-
JPQL 조인
내부 조인 내부조인은 INNER JOIN을 사용하고, INNER는 생략할 수 있다. String teamName = "팀A"; String query = "SELECT m FROM Member m INNER JOIN m.team t " +"WHERE t.name = :teamName"; List members = em.createQuery(query, Member.class) .setParameter("teamName", teamName) .getResultList(); 회원과 팀을 내부 조인해서 '팀A'에 소속된 회원을 조회한다. 외부 조인 SELECT m FROM Member m LEFT [OUTER] JOIN m.team t 다음과 같이 사용하고, OUTER는 생략 가능하다. 컬렉션 조인 일대다 관..
2023.10.10 -
JPQL - (기본 문법, 쿼리 API, 페이징 API, 집합과 정렬)
기본 문법과 쿼리 API JPQL도 SQL과 비슷하게 SELECT, UPDATE, DELETE 문을 사용할 수 있다. 참고로 엔티티를 저장할 때는 EntityManager.persist() 메소드를 사용하면 되므로 INSERT 문은 없다. select_문 :: = select_절 from_절 [where_절] [groupby_절] [having_절] [orderby_절] update_문 :: = update_절 [where_절] delete_문 :: = delete_절 [where_절] SELECT 문 SELECT 문은 다음과 같이 사용한다. SELECT m FROM Member AS m where m.username = 'Hello' 엔티티와 속성은 대소문자를 구분한다. (Member, username..
2023.09.25 -
객체지향 쿼리 언어 소개
JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다. EntityManager.find() 메소드를 사용하면 식별자로 엔티티 하나를 조회할 수 있다. 이렇게 조회한 엔티티에 객체 그래프 탐색을 사용하면 연관된 엔티티들을 찾을 수 있다. 이 둘은 가장 단순한 검색 방법이다. 식별자로 조회 EntityManager.find() 객체 그래프 탐색 a.getB().getC() 이 기능만으로 애플리케이션을 개발하기는 어렵다. 예를 들어 나이가 24살 이상인 회원을 모두 검색하고 싶다면 좀 더 현실적이고 복잡한 검색 방법이 필요하다. 결국 데이터는 데이터베이스에 있으므로 SQL로 필요한 내용을 최대한 걸러서 조회해야 한다. 하지만 ORM을 사용하면 데이터베이스 테이블이 ..
2023.09.22 -
값 타입
값 타입은 3가지로 나눌 수 있다. 기본값 타입(자바 기본 타입, 래퍼 클래스, String) 임베디드 타입 컬렉션 값 타입 1. 기본값 타입 @Entity public class Member { @Id @GeneratedValue private Long id; private String name; private int age; ... } Member 엔티티에서 String, int가 값 타입이다. Member 엔티티는 id라는 식별자 값도 가지고 생명주기도 있지만 값 타입인 name, age 속성은 식별자 값도 없고 생명주기도 회원 엔티티에 의존한다. 따라서 회원 엔티티 인스턴스를 제거하면 name, age 값도 제거된다. 그리고 값 타입은 공유하면 안된다. 2. 임베디드 타입(복합 값 타입) 새로운 ..
2023.09.22 -
영속성 전이: CASCADE
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용하면 된다. JPA는 CASCADE 옵션으로 영속성 전이를 제공한다. // 부모 엔티티 @Entity public class Parent { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "parent") private List children = new ArrayList(); ... } //자식 엔티티 @Entity public class Child { @Id @GeneratedValue private Long id; @ManyToOne private Parent parent; ... } 부모 엔티티가 여러가지 자식 엔티티를 가지고 있다...
2023.07.31 -
즉시 로딩과 지연 로딩
즉시 로딩 즉시 로딩(Eager Loading)을 사용하려면 @ManyToOne의 fetch 속성을 FetchType.EAGER로 지정한다. // 즉시 로딩 설정 @Entity public class Member { ... @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "TEAM_ID") private Team team; ... } 위의 코드에서 회원과 팀을 즉시 로딩으로 설정했다. // 즉시 로딩 실행 코드 Member member = em.find(Member.class, "member1"); Team team = member.getTeam(); //객체 그래프 탐색 따라서 em.find(Member.class, "member1")로 회원을 조회하는..
2023.07.31