객체지향 쿼리 언어5 - SubQuery & 타입표현
- 소개
- 기본 문법과 쿼리API
- 프로젝션(SELECT)
- 페이징
- 조인
- 서브 쿼리
- JPQL 타입 표현과 기타식
- 조건식 (CASE 등등)
- JPQL 함수
01. SubQuery
-
나이가 평균보다 많은 회원
SELECT m FROM Memberm m WHERE m.age > ( SELECT avg(m2.age) FROM Member m2 )
-
한 건이라도 주문한 고객
SELECT m
FROM Member m
WHERE (
SELECT count(o)
FROM Order o
WHERE m = o.member
) > 0
- 어떤 팀이든 팀에 소속된 회원
SELECT m
FROM Member m
WHERE m.team = ANY (SELECT t FROM Team t)
02. JPA 서브쿼리 한계
- JPA는 Where, Having 절에서만 서브 쿼리 가능
- SELECT 절도 가능 (하이버네이트 지원)
- FROM 절의 서브 쿼리는 현재 JPQL에서 불가능
- 조인으로 풀 수 있으면 풀어서 해결
03. JPQL 타입 표현
- 문자
- ‘Hello’, ‘She”s’
- 숫자
- 10L (Long)
- 10D (Double)
- 10F (Float)
- Boolean
- TRUE
- FALSE
- ENUM
- jpabook.MemberType.Admin (패키지명 포함)
- 엔티티 타입
- TYPE(m) = Member (상속 관계에서 사용)
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinCOlumn(name = "TEAM_ID")
private Team team;
@Enumerated(EnumType.STRING)
private MemberType type; // 이 부분
}
Member member = new Member();
member.setUsername("teamA");
member.setAge(10);
member.setType(MemberType.ADMIN);
// 타입은 패키지명까지 포함해서 조회해야 한다.
String query = "select m.username, 'HELLO', true, from Member m " +
"where m.type = jpql.MemberType.ADMIN";
// 파라미터 바인딩으로 동적으로 처리하면 패키지명을 모두 적을 필요가 없다.
String query = "select m.username, 'HELLO', true, from Member m " +
"where m.type = :userType";
List<Object[]> result = em.createQuery(query)
.setParameter("userType", MemberType.ADMIN)
.getResultList();
댓글남기기