select m from Member as m where m.age > 18
TypeQuery : 반환 타입 명확 (거의 Entity 타입)
Query : 반환 타입 불명확
TypedQuery<Member> query1 =
em.createQuery("select m from Member m", Member.class);
TypedQuery<String> query2 =
em.createQuery("select m.username from Member m", String.class); // m.username : string
Query query3 =
em.createQuery("select m.username, m.age from Member m"); // m.uesrname : string , m.age : int
query.getResultList()
query.getSingleResult()
이름 기준
SELECT m FROM Member m where m.username=:username
query.setParameter("username", usernameParam);
위치 기준
SELECT m FROM Member m where m.username=?1
query.setParameter(1, usernameParam);
엔티티 프로젝션 1
select m from Member m
엔티티 프로젝션 2
select m.team from Member m
다른 테이블인 경우 JOIN 쿼리가 실행되는데 위 쿼리로는 예측이 불가능
따라서 아래처럼 작성
select t from Member m join m.team t
임베디드 타입 프로젝션
select m.address from Member m
소속되어있기 때문에 아래처럼 작성 불가
임베디드 타입만으로는 안되고 엔티티를 정해줘야함
select address from Address o
스칼라 타입 프로젝션
select m.username, m.age from Member m
Query 타입으로 조회
Object[] 타입으로 조회
new 명령어로 조회
setFirstResult (int startPosition)
setMaxResults (int maxResult)
ex)
String jpql = "select m from Member m order by m.name desc";
List<Member> resultList = em.createQuery(jpql, Member.class)
.setFirstResult(10)
.setMaxResults(20)
.getResultList();
SELECT
M.ID AS ID,
M.AGE AS AGE,
M.TEAM_ID AS TEAM_ID,
M.NAME AS NAME
FROM
MEMBER M
ORDER BY
M.NAME DESC LIMIT ?, ?
SELECT * FROM
( SELECT ROW_.*, ROWNUM ROWNUM_
FROM
( SELECT
M.ID AS ID,
M.AGE AS AGE,
M.TEAM_ID AS TEAM_ID,
M.NAME AS NAME
FROM MEMBER M
ORDER BY M.NAME
) ROW_
WHERE ROWNUM <= ?
)
WHERE ROWNUM_ > ?
ON절 활용
지원 함수
[NOT] EXIST (subquery) : 서브쿼리에 결과가 존재하면 참
[NOT] IN (subquery) : 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참
한계
문자
'HELLO'
'She''s'
숫자
10L (Long)
10D (Double)
10F (Float)
Boolean
TRUE
FALSE
ENUM
jpabook.MemberType.Admin (패키지명 포함)
엔티티 타입
TYPE(m) = Member (상속 관계에서 사용)
case ~ end
coalesce
하나씩 조회해서 null이 아니면 반환
nullif
두 값이 같으면 null 반환, 다르면 첫 번째 값 반환
concat, substring, trim, lower, upper, length, locate, abs, sqrt, mod
size, index