JPA

2월 13일 JPA JPQL(java persistence query language)

Chaerin Yoo 2023. 2. 13. 15:14

JPQL(java persistence query language)

 

JPQL 기본 문법과 기능

소개

-JPQL은 객체지향 쿼리언어 이다. 따라서 테이블을 대상으로 쿼리를 짜는게 아니라 엔티티 객체를 대상으로 쿼리를 짠다.

-JPQL은 SQL을 추상화 해서 특정 DB SQL에 의존하지 않는다.

-JPQL은 결국 SQL로 변환된다.

 

-Member 와 Team의 다대일 관계 양방향

@Entity

public class Member{

@Id @GenerateValue

private Long id;

private String username;

private int age;

@ManyToOne

@JoinColumn("team_id") //DB테이블과 매핑 여기가 주인

private Team team; 

}

 

 

@Entity

public class Team{

@Id @GenerateValue

private Long id;

private String name;

@OneToMany(mappedBy="team") // 주인쪽 엔티티에 연결할 필드

private List<Member> members = new ArrayList<>();

}

 

Order , Product , Address

@Entity

@Table(name = "orders")

public class order{

@Id @GenerateValue

private Long id;

private int orderAmount;

@Embadded //임베디드 타입 클래스 사용

private Address address;

@ManyToOne //다대일 관계 사용

@Column(name = "product_id")

private product product;

}

 

@Embaddable //값 타입 선언 , @Entity를 선언하지않음

public class Address{

private String city;

private String street;

private String zipCode;

}

 

@Entity

public class Product{

@Id @GenerateValue

private Long id;

private String name;

private int price;

private int stockAmount;

}

 

JPQL 문법

select 문

 

select 절

from 절

[where]절

[group by] 절

[having] 절

[order by]절

 

update 문

update절 

[where]절

 

delete문

delete 절

[where]절

 

-select m from Member m where m.age > 18;

-엔티티와 속성은 대소문자 구분한다,(Member , age)

-JPQL 키워드는 대소문자를 구분하지 않는다 (select , from , where)

-엔티티 이름 사용 , 테이블  이름이 아니다.(Member)

-별칭은 필수! (m) (as는 생략 가능)

 

집합과 정렬

select 

count(m) // 총 횟수

sum(m.age) // 합

avg(m.age) // 평균

max(m.age) // 최대값

min(m.age) // 최소값

from Member m

 

group by , order by , having

 

TypeQuery , query

TypeQuery : 반환타입이 명확할 때 사용

Query : 반환타입이 명확하지 않을 때 사용

 

타입쿼리 사용

TypeQuery<Member> query = em.create("select m from Member m" , Member.class);

반환 타입을 명시

 

쿼리 사용

Query query = em.createQuery("select m.username , m.age from Member m"); //반환 타입이 불명확

select 하고 있는 데이터가 String , int 여러개일 경우 타입을 하나로 명시할 수 없다.

1개 뿐이라면 String 이나 int 를 반환타입으로 사용 가능하다.

 

결과 조회 API

query.getResultList()

결과가 하나 이상일때 그 결과들을 리스트로 반환

결과가 없으면 빈리스트 반환 //결과가 없어도 오류가 없다.

 

query.getSingleResult()

결과가 적확히 하나일대만 단일 객체를 반환

결과가 없으면 javax.persistence.noResultException을 반환

둘이상의 결과가 있으면 javax.persistence.NotUniqueResultException 을 반환

 

List<Member> resultQuery = query.getResultList(); // 결과가 없어도 ok

Member result = query.getSingleResult(); // 결과가 없거나 하나보다 많으면 에러를 반환

 

파라미터 바인딩 . 이름기준 , 위치기준

select m from Member m where m.username = :username

query.setParameter("username" , usernameParam)

쿼리에서 사용된 : 로 시작하는 단어중 "username"을 usernameParam의 값으로 바꿔주는 용도(동적 쿼리에 사용)

파라미터로 사용되는 단어에는 : 를 붙여서 표시한다.