JPA(10)
-
[JPA, QueryDsl] inner join ? left join ?
querydsl 을 사용한 예시를 보면 대부분 left join을 사용하는 것을 볼 수 있었다. 이번 팀 프로젝트를 진행하며 내게 querydsl을 알려주시던 분은 항상 left join을 사용했다. 그런데 어떤 이유로 left join을 사용하는 것인지, 모든 경우에 left join을 사용해야 하는지가 궁금해졌다. 그래서 찾아본 결과로 대부분의 상황은 left join으로 해결이 되긴 했다. 왜냐하면 left join 으로 필요한 entity의 결과를 모두 조회한 후, 조인조건에 맞게 조인테이블을 합친 후 where절로 다시 한 번 조건을 걸어주는게 일반적이기 때문이다. 이걸 inner join으로 사용한다면 on에서 where의 역할을 수행한다고 볼 수 있다. 하지만 성능면에서 보면 left joi..
2023.06.06 -
[JPA] 프록시 동일 객체 (==, equals) 비교 실패 ? instanceOf 사용
- 프록시 객체는 처음 사용할 때 한 번만 초기화 - 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것이 아니다. 실제 엔티티에 접근을 하는 것일 뿐. - 프록시 객체는 원본 엔티티를 상속 받고 있다. 그래서 타입 체크할 때 == 비교시에 실패 가능성이 있다. (로직이 복잡해지면 받아온 객체가 프록시인지 실제 객체인지 구분이 어렵기 때문) -----> instanceof 사용해야 한다. - 영속성 컨텍스트에 엔티티가 이미 있으면, 프록시를 호출하는 getReference를 호출해도 실제 엔티티가 반환된다. - 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일때 프록시를 초기화하면 예외 발생 (하이버네이트 - org.hibernate.LazyInitailizationException..
2023.05.28 -
[JPA] 쿼리 파라미터 값으로 동적인 결과를 반환할 때 null값 처리(검색 필터링)
예를 들어 category를 선택하고 검색을 할 수 있어서 2가지 이상으로 필터링을 한다면 '?category=운동&search=철봉' 이렇 쿼리 파라미터가 추가된다. 하지만 필터링을 한 가지만 쓴다면 '?category=운동&search=' 처럼 값이 없는 경우가 생길 수 있다. 이런 경우에는 컨트롤러나 서비스 계층에서 값의 유무를 체크(빈값인지)해서 null값으로 JPA 에게 보내준다. //서비스 계층에서 예시 if (StringUtils.isEmpty(category)) category = null; if (StringUtils.isEmpty(search)) search = null; JPA를 구현한 레포지토리 계층에서는 조건절에 'IS NULL' 을 통해 NULL값이라면 무시할 수 있도록 QUER..
2023.05.09 -
[JPA] JPQL - join 예시
[기본 join 문] 1. inner join (inner 생략 가능) SELECT m FROM Member as m inner join m.team t where t.name = :teamName"; query 문 -> select m.* from member m join team t on m.team_id = t.id 2. outer join (left/right) SELECT m FROM Member as m left join m.team t; query문 -> select m.*, t.* from member m left join team t on m.team_id = t.id [조인 대상 필터링] + on SELECT m FROM Member as m inner join m.team t on t..
2023.05.08 -
[JPA] JPQL - 페이징
페이징 처리 예시 List result = em.createQuery("select m from Member m order by m.age desc", Member.class) .setFirstResult(몇번째부터) .setMaxResults(몇개가지고올거다) .getResultList();
2023.05.08 -
[JPA] JPQL- 기본 쿼리문 예시
[JPQL] 쿼리문 예시] 1. entity타입을 반환 List result = em.createQuery("select m from Member as m", Member.class).getResultList(); 2. 참조하는 entity를 반환 (join) List result = em.createQuery("select t from Member as m join m.team as t", Team.class).getResultList(); 3. entity가 가지고 있는 값타입을 반환 List result = em.createQuery("select m.Adress from Member as m", Adress.class).getResultList(); 4. entity가 가지고 있는 타입이 다른 속..
2023.05.08