- JPQL은 객체지향 쿼리 언어다.
➡️ 테이블을 대상으로 쿼리하는 것이 아니라엔티티 객체를 대상으로 쿼리
한다.- JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다
- JPQL은 결국 SQL로 변환된다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
//getter , setter...
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
public Long getId() {
return id;
}
}
@Entity
@Table(name = "ORDERS")
public class Order {
@Id @GeneratedValue
private Long id;
private int orderAmount;
@Embedded
private Address address;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
}
@Entity
public class Product {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
private int stockAmound;
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
JPQL의 기본 문법과 쿼리API에 대해 알아보자
SELECT m FROM Member as m WHERE m.age > 18
엔티티 명을 사용
한다. 테이블 명이 아니다!(Member)count(m)
: 회원 수sum(m.age)
: 나이 합avg(m.age)
: 평균 나이max(m.age)
: 최대 나이min(m.age)
: 최소 나이group by
, having
반환 타입이 명확
할 때 사용반환 타입이 명확하지 않을 때
사용//TypeQuery
TypedQuery<Member> query =
em.createQuery("SELECT m FROM Member m", Member.class);
//Query
Query query = em.createQuery("SELECT m.username, m.age FROM Member m");
- query.getResultList() :
결과가 하나 이상
일 때 리스트 반환- query.getSingleResult() :
결과가 정확히 하나
일 때 단일 객체
반환
- 결과가 없으면 :
javax.persistence.NoResultException
- 결과가 둘 이상이면 :
javax.persistence.NonUniqueResultException
//결과가 하나 이상
TypedQuery<Member> query = em.createQuery("SELECT m FROM Meber m", Member.class);
List<Member> resultList = query.getResultList();
//결과가 하나
TypedQuery<Member> query = em.createQuery("SELECT m FROM Meber m WHERE m.id = 10", Member.class);
Member Result = query.getSingleResult();
//username이 member1인 회원 찾기
Member result =
em.createQuery("SELECT m FROM Member m WHERE m.username = :username", Member.class)
.setParameter("username", "member1")
.getSingleResult();
- :username : 파라미터로 바인딩할 변수명
- .setParameter("파라미터로 바인딩할 변수명", "바인딩할 문자")
//username이 member1인 회원 찾기
Member result =
em.createQuery("SELECT m FROM Member m WHERE m.username = ?1", Member.class)
.setParameter(1, "member1")
.getSingleResult();
❌가급적 위치기준은 사용하지 말기
중간에 변수를 끼워넣게 되면 다 순서가 밀림!