JPA
-
경로 표현식JPA/JPQL 2023. 8. 9. 11:43
경로 표현식 : .(점)을 찍어 객체 그래프를 탐색하는 것 select m.username // 상태 필드 from Member m join m.team t // 단일 값 연관 필드 join m.orders o // 컬렉션 값 연관 필드 where t.name = '팀A' 경로 표현식 종류 - 상태 필드(state filed) : 단순히 값을 저장하기 위한 필드 - 연관 필드(association filed) : 연관관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne, 매핑 대상이 엔티티 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 매핑 대상이 컬렉션 경로 표현식 특징 1. 상태 필드 : 경로 탐색의 끝이며 탐색을 하지 않음 2. 단일 값 연관 경로 ..
-
조건식 (CASE)JPA/JPQL 2023. 7. 14. 00:35
기본 CASE 식 "select " + "case when m.age = 60 then '경로요금' " + " else '일반요금' " + "end " + "from Member m"; 단순 CASE 식 "select " + "case t.name " + "when '팀A' then '인센티브110%' " + "when '팀B' then '인센티브120%' " + "else '인센티브105%' " + "end " + "from Team t"; CASE 식을 만들어서 특정 조건일 때를 호출 할 수 있다. COALESCE: 하나씩 조회해서 null이 아니면 반환 NULLIF: 두 값이 같으면 null 반환, 다르면 첫번째 값 반환 사용자 이름이 없으면 이름 없는 회원을 반환 select coalesce(m...
-
서브 쿼리JPA/JPQL 2023. 7. 14. 00:21
서브 쿼리의 예제들 - 나이가 평균보다 많은 회원 select m from Member m where m.age > (select avg(m2.age) from Member m2) (상위에서 정의한 Member m을 가져오지 않고 m2를 새로 만들어야지 서브 쿼리 성능이 잘 나옴) - 한 건이라도 주문한 고객 select m from Member m where (select count(o) from Order o where m = o.member) > 0 (서브 쿼리를 할 때 위에서 사용한 m을 아래 서브 쿼리로 끌고오면 성능이 잘 안 나옴) 서브 쿼리 지원 함수 [NOT] EXISTS (subquery): 서브쿼리에 결과가 존재하면 참 {ALL | ANY | SOME} (subquery) ALL 모두 ..
-
페이징, 조인JPA/JPQL 2023. 7. 14. 00:05
페이징 List result = em.createQuery("select m from Member m order by m.age desc", Member.class). .setFirstResult(1) // 시작 .setMaxResults(10) // 몇 개 가져올지 .getResultList(); 페이징 쿼리가 네이티브 sql보다 훨씬 간편하게 나온다. MySQL로 따진다면 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 m FROM Member m [INNER] JOIN m...
-
프로젝션(SELECT)JPA/JPQL 2023. 7. 13. 23:07
프로젝션이란? 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 distince m.username, m.age from Member m"처럼) 간단한 것이지만 중요한 내용이 있다. 엔티티 프로젝션을 하면 그 엔티티의 대상이 영속성 컨텍스트로 관리된다는 ..
-
JPA에서의 쿼리 언어들JPA/JPQL 2023. 7. 13. 22:03
JPA에서는 다양한 쿼리 언어들을 지원한다. JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate을 함께 사용 1. JPQL JPA를 사용하면 엔티티 객체를 중심으로 개발을 진행하게 된다. 문제는 검색 쿼리인데, 검색을 할 때에도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 한다. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 -> 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. 이런 문제를 해결하기 위해서JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVIN..
-
간단한 주문조회 API - 지연 로딩과 조회 성능 최적화(2)JPA/JPA 활용 2023. 7. 11. 18:16
저번 포스팅에서 Order 조회 버전 1과 2를 했는데, 1에서는 엔티티를 그대로 사용해서 문제점이 있었고, 2에서는 Lazy 로딩때문에 쿼리가 너무 많이 호출되는 문제점이 있었다. 이번에 Version 3에서는 fetch join으로 성능 최적화를 진행할 것이다. Version3 orderRepository에 finAllWithMemberDelivery() 메서드 추가 public List findAllWithMemberDelivery() { return em.createQuery( "select o from Order o" + " join fetch o.member m" + // order 가져올 때 멤버까지 한방 쿼리로 가져오는 'join fetch' " join fetch o.delivery d"..
-
간단한 주문조회 API - 지연 로딩과 조회 성능 최적화JPA/JPA 활용 2023. 7. 11. 18:15
지연 로딩 때문에 발생하는 성능 문제를 단게적으로 해결하는 것이다. 버전을 1부터 4까지 늘리면서 잘 실수하는 부분을 조금씩 개선해나가는 것이다. 실험용 초기 데이터 @Component @Transactional @RequiredArgsConstructor static class InitService { private final EntityManager em; public void dbInit1() { Member member = new Member(); member.setName("userA"); member.setAddress(new Address("서울", "1", "1111")); em.persist(member); // 영속상태로 만듦 Book book1 = new Book(); book1.se..