
해당 시리즈는 김영한님의 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 > 18Member, age)JPQL 키워드는 대소문자 구분X (SELECT, FROM, where) 엔티티 이름 사용, 테이블 이름이 아님(Member)GROUP BY, HAVINGORDER BYTypeQuery: 반환 타입이 명확할 때 사용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.NoResultExceptionjavax.persistence.NonUniqueResultExceptionSELECT 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 mQuery 타입으로 조회Object[] 타입으로 조회new 명령어로 조회DTO로 바로 조회SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member mJPA는 페이징을 다음 두 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 tSELECT m FROM Member m LEFT [OUTER] JOIN m.team tSELECT COUNT(m) FROM Member m, Team t WHERE m.username = t.nameON 절을 활용한 조인(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 용도)