JPQL Paging API
·
📦 Database/JPQL
💡 페이징 API JPA는 페이징 API를 다음 두 API로 추상화 해뒀다. 조회 시작위치(0부터 시작) setFirstResult(int startPosition) 조회할 데이터 수 setMaxResults(int maxResult) 예시 모든 데이터 베이스의 방언이 동작한다. LIMIT & OFFSET은 MySQL 방언이다. hibernate.dialect를 Oracle12cDialect로 변경해주면 Oracle 방언인 rownum 3 depth 전략으로 페이징을 짠다. // Member Class에 toString()을 Override 해준다. for (int i=0, i
JPQL Projection
·
📦 Database/JPQL
💡 프로젝션 Select에 조회할 대상을 지정하는 것이다. 프로젝션의 대상은 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)이다. 프로젝션 조회 대상은 전부 영속성 컨텍스트의 관리 대상이다. 엔티티 프로젝션(멤버 조회) SELECT m FROM Member m ... 결과는 멤버가 조회된다. 엔티티 프로젝션(멤버 안에 있는 팀 조회) SELECT m.team FROM Member m ... 결과는 멤버가 아닌 멤버의 팀이 결과로 조회된다. List result = em.createQuery("select m.team from Member m", Team.class) .getResultList(); // --- 쿼리 튜닝의 편리함을 위해 명시적 Join 형식으로 Join을 하는걸 ..
JPQL Type Query & Sub Query
·
📦 Database/JPQL
💡 TypeQuery & Query TypeQuery 반환 타입이 명확할 때 사용 Query 반환 타입이 명확하지 않을 때 사용 // Member 타입, 명확한 반환 타입 TypedQuery query = em.createQuery("SELECT m FROM member m", Member.class); // String, int 2가지의 명확하지 않은 반환 타입 Query query = em.createQuery("SELECT m.username, m.age from Member m"); 💡 JPA Sub Query 쿼리 안에 서브 쿼리 작성 JPA 서브 쿼리의 한계 JPA는 WHERE, HAVING 에서만 서브 쿼리 사용 가능 SELECT도 가능 (Hibernate에서 지원) FROM의 서브 쿼리는 ..
JPQL Basic
·
📦 Database/JPQL
💡 JPQL 객체지향 쿼리 다양한 쿼리 지원 JPQL JPA Criteria QueryDSL 동적 쿼리 생성의 편리함 실무 사용 권장 Native SQL JPQL로 해결할 수 없는 DB 의존적인 기능을 사용할 때 ex: Oracle CONNECT BY, SQL HINT createNativeQuery() 사용 JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 영속성 컨텍스트를 적잘한 시점에 강제로 flush가 필요하다. ex: JPA를 우회해서 SQL을 실행하기 직전 수동 flush JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, JDBC Template, MyBatis 등 혼용 가능 소개 Java Persistence Query Language 가장 단순한..