JPA 15

Querydsl 서브쿼리

Querydsl에서 서브쿼리 사용 시 새로운 Q타입의 객체를 생성하여 중첩되지 않도록 사용하여야 한다. 1. Where 절에 서브쿼리 사용 예 1 /** * 나이가 가장 많은 회원 */ @Test public void subQuery() throws Exception { QMember sub = new QMember("memberSub");// 서브쿼리 Q타입 객체 생성 //when List result = queryFactory .selectFrom(member) .where(member.age.eq( JPAExpressions .select(sub.age.max()) .from(sub))) //fetch는 하지 않는다 .fetch(); //then assertThat(result).extracting..

JPA 2024.03.31

Querydsl 정리

기존에 활용해 보았던 Querydsl에 대하여 추가적으로 알게 된 기능들을 정리해 본다. Dto를 Q타입으로 사용하는 방법(@QuertProjection) @Data public class MemberTeamDto { private Long memberId; private String username; private int age; private Long teamId; private String teamName; @QueryProjection public MemberTeamDto(Long memberId, String username, int age, Long teamId, String teamName) { this.memberId = memberId; this.username = username; th..

JPA 2024.03.29

JPA , QueryDsl 수정 중 에러 해결

동적 쿼리에 대한 기능을 수정이 필요하여 JPA와 QueryDsl의 코드를 일부 수정했다. 수정하던 중 발생한 Exception들을 정리하여 보았다. @Query 메서드를 통해 작성되어 있던 코드에서 에러가 발생하였다. JPQL 코드 @Query(value = "select " + "d " + "from Deposit d " + "join ProjectMember pm on d.projectMember = pm " + "join Member m on pm.member = m " + "join User u on m.user = u " + "join Project p on pm.project = p " + "where d.status in (:statusList) " + "and d.createdDate >..

JPA 2024.03.17

영속성 컨텍스트

엔티티 생명주기 비영속 (new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속 (managed) 영속성 컨텍스트에 관리되는 상태 준영속 (detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) 삭제된 상태 영속성 컨텍스트는 엔티티를 관리하는 환경으로 Key와 그에 해당하는 객체로 엔티티를 관리한다. 영속성 컨텍스트를 동해 얻는 이점 1차 캐시에 저장하여 관리함으로 실제 DB에 커넥팅 하지 않고 DB의 값을 조회하는 등 성능상 이점 캐시를 통해 관리함으로 트렌젝션 내 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind) 변경 감지(Dirty Checking)를 통한 저장 지연 로딩(Lazy L..

JPA 2024.01.28

JPQL문법 2 (페치 조인,벌크 연산)

페치 조인(fetch join) SQL의 조인 종류가 아닌JPQL의 특수한 기능 JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 join fetch 명령어 사용 페치 조인 ::= [ LEFT [OUTER] | INNER ] JOIN FETCH 조인경로 예시) member1,3을 teamA에 member2를 teamB에 넣었다고 가정하자. Team team = new Team(); team.setName("teamA"); em.persist(team); Team team2 = new Team(); team2.setName("teamB"); em.persist(team2); Member member = new Member(); member.setNa..

JPA 2022.12.23

JPQL 문법 1

JPQL 문법 기초 select m from Member as m where m.age > 18 엔티티와 속성은 대소문자를 구분한다. 엔티티와 인스턴스의 대소문자를 신경 써야한다. (Member, Team, age, name) JPQL 키워드는 대소문자 구분을 하지 않는다. (SELECT, FROM, WHERE / 소문자도 가능) 테이블 명이 아닌 엔티티의 이름 사용한다. (Member = O / MEMBER = X) 별칭은 필수로 기입해야한다. (m) (as는 생략가능) 집합과 정렬 SQL에서 지원하는 아래와 같은 함수가 모두 가능하다. select COUNT(m), //회원수 SUM(m.age), //나이 합 AVG(m.age), //평균 나이 MAX(m.age), //최대 나이 MIN(m.age),..

JPA 2022.12.22

JPA 쿼리 언어 종류

JPA 지원하는 쿼리 방식 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTEmplete 함께 사용 JPQL 조회 방법이 가장 단순함(EntityManager.find()) 객체 그래프 탐색이 가능함(a.getB().getC) 조건을 주고 검색 할 때 JPA를 사용하면 엔티티 객체 중심으로 개발 검색할 때도 테이블이 아닌 엔티티를 대상으로 검색하는 것이 객체 지향적임 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB에서 불러오는 검색조건이 포함된 쿼리문이 필요 JPQL 특징 JPQL = JPA에서 SQL을 추상화한 객체지향 쿼리 언어 제공 SQL문과 유사한 SELECT, FROM,W..

JPA 2022.12.22

값 타입 정리

JPA의 테이터 타입분류 (최상위) 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 회원 엔티티의 정보가 변경되도 ID로 인식 가능 값 타입 int Integer String 처럼 단순한 값으로 사용하는 자바 기본타입인 객체 식별자가 없고 값만 있음으로 변경시 추적 불가 값 타입 분류 기본값 타입 : 생명주기를 엔티티에 의존(Entity 삭제시 필드도 삭제) 값 타입은 공유하면 안됨(서로 다른 객체가 동시 변경되거나 생성되면 안됨) 기본값 종류 자바 기본 타입: int, duble 기본타입은 절대 공유되지 않음 기본 타입은 항상 값을 복사함 래퍼클래스 : Integer, Long 래퍼 타입은 특수 클래스를 공유(참조)가능하지만 변경 할 수 없음 String 임베디드..

JPA 2022.12.21

프록시와 연관관계 (즉시로딩/지연로딩)

em.find() vs em.getReference() find : 데이터베이스를 통해 실제 엔티티 객체를 조회함 getReference : 데이터베이스 조회를 미루는 가짜 엔티티 객체() 조회 프록시의 특징 프록시 객체는 처음 사용할 때 한번만 초기화됨 프록시 객체를 초기화 할때 프록시 객체가 실제 엔티티로 바뀌는것이 아님, 초기화 되면 프록시 객체를 통해 실제 엔티티에 접근이 가능하다. 프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크시 == 비교가 불가, instance of 사용하여 비교. 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 getReference()를 호출해도 프록시 객체가 아닌 실제 엔티티 객체가 반환됨 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때(EntityMan..

JPA 2022.12.21

@MappedSuperclass

객체의 공통된 속성이 존재할 때, 해당 속성을 BaseEntity로 설정하여 같은 속성을 컬럼값으로 지정할 수 있다. BaseEntity @MappedSuperclass public abstract class BaseEntity { private Long id; private String name; 위와 같이 @MappedSuperClass로 공통속성을 지정하여 Member와 Seller 객체의 인스턴스처럼 ,DB의 컬럼처럼 사용 할 수 있다. Member 엔티티 @Entity public class Member extends BaseEntity { @Id @GeneratedValue private Long id; ...... 해당 속성값을 상속받을 엔티티에서는 extends 로 상속받아 사용한다. 상속..

JPA 2022.12.20