2월 13일 JPA JPQL(java persistence query language)
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의 값으로 바꿔주는 용도(동적 쿼리에 사용)
파라미터로 사용되는 단어에는 : 를 붙여서 표시한다.