해당 시리즈는 김영한님의 JPA 로드맵을 따라 학습하면서 내용을 정리하는 글입니다
JDBC API
직접 사용, MyBatis
, SpringJdbcTemplate
함께 사용EntityManager.find()
a.getB().getC()
)JPA
를 사용하면 엔티티 객체를 중심으로 개발하게 됩니다SQL
이 필요합니다JPA
는 SQL
을 추상화한 JPQL
이라는 객체 지향 쿼리 언어를 제공합니다SQL
과 문법이 유사합니다, SELECT
, FROM
, WHERE
, GROUP BY
, HAVING
, JOIN
지원JPQL
은 엔티티 객체를 대상으로 쿼리를 만듭니다SQL
에 의존하지 않습니다String jpql = "SELECT m FROM Member m WHERE m.name LIKE '%hello%'";
List<Member> result = em.createQuery(jpql, Member.class).getResultList();
JPQL
을 작성할 수 있도록 해줍니다JPQL
빌더 역할// JPQL
// SELECT m FROM Member m WHERE m.age > 18
JPAFactoryQuery query = new JPAQueryFactory(em);
QMember m = QMember.member;
List<Member> list =
query.selectFrom(m)
.where(m.age.gt(18))
.orderBy(m.name.desc())
.fetch();
JPA
를 사용하면서 JDBC
커넥션을 직접 사용하거나, 스프링 JdbcTemplate
, MyBatis
등을 함께 사용 가능합니다SELECT m FROM Member AS m WHERE m.age > 18
Member
, age
)JPQL
키워드는 대소문자 구분X (SELECT, FROM, where
) 엔티티 이름 사용, 테이블 이름이 아님(Member
)GROUP BY
, HAVING
ORDER BY
TypeQuery
: 반환 타입이 명확할 때 사용Query
: 반환 타입이 명확하지 않을 때 사용TypeQuery<Member> query
em.createQuery("SELECT m FROM Member m", Member.class);
Query query =
em.createQuery("SELECT m.username, m.age from Member m");
query.getResultList()
: 결과가 하나 이상일 때, 리스트 반환query.getSingleResult()
: 결과가 정확히 하나, 단일 객체 반환javax.persistence.NoResultException
javax.persistence.NonUniqueResultException
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);
SELECT
절에 조회할 대상을 지정하는 것SELECT m FROM Member m
-> 엔티티 프로젝션SELECT m.team FROM Member m
-> 엔티티 프로젝션SELECT m.address FROM Member m
-> 임베디드 타입 프로젝션SELECT m.username, m.age FROM Member m
-> 스칼라 타입 프로젝션DISTINCT
로 중복 제거SELECT m.username, m.age FROM Member m
Query
타입으로 조회Object[]
타입으로 조회new
명령어로 조회DTO
로 바로 조회SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
JPA
는 페이징을 다음 두 API
로 추상화합니다// 페이징 쿼리
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 FROM Member m [INNER] JOIN m.team t
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
SELECT COUNT(m) FROM Member m, Team t WHERE m.username = t.name
ON
절을 활용한 조인(JPA 2.1부터 지원) SELECT m, t FROM Member m LEFT JOIN m.team t ON t.name = 'A
SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.TEAM_ID = t.id and t.name = 'A
SELECT m FROM Member 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
[NOT] EXISTS
(subquery): 서브 쿼리에 결과가 존재하면 참ALL
| ANY
| SOME
} (subquery)ALL
: 모두 만족하면 참ANY
, SOME
: 같은 의미, 조건을 하나라도 만족하면 참SELECT m FROM Member m
WHERE EXISTS (SELECT t FROM m.team t WHERE t.name = 'A')
SELECT o FROM Order o
WHERE o.orderAmount > ALL (SELECT p.stockAmount FROM Product p)
SELECT m FROM Member m
WHERE m.team = ANY (SELECT t FROM Team t)
문자
: ‘HELLO’, ‘She’’s’숫자
: 10L(Long), 10D(Double), 10F(Float)Boolean
: TRUE, FALSEENUM
: jpabook.MemberType.Admin (패키지명 포함)엔티티 타입
: TYPE(m) = Member (상속 관계에서 사용)CONCAT
: 문자를 더하는 함수SUBSTRING
: 문자열을 부분 잘라내는 함수TRIM
: 공백을 제거하는 함수LOWER
, UPPER
: 대소문자 변환하는 함수LENGTH
: 길이LOCATE
: 문자열에서 특정 문자의 위치 반환 함수ABS
, SQRT
, MOD
: 수학 함수SIZE
, INDEX
(JPA
용도)