메소드 이름으로 쿼리 생성 메소드 이름을 분석해서 JPQL 쿼리 실행 예) 이름과 나이름 기준으로 회원을 조회하려면? JPA Repository public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } JPA 테스트 코드 @Test public void findByUsernameAndAgeGreaterThan() { Memb..
💻dev/🌱Java+Spring
다형성 쿼리 TYPE 조회 대상을 특정 자식으로 한정 예) Item 중에서 Book, Movie를 조회해라 [JPQL] select i from Item i where type(i) IN (Book, Movie) [SQL] select i from i where i.DTYPE in (‘B’, ‘M’) TREAT 자바의 타입 캐스팅과 유사하다. 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용한다. FROM, WHERE, SELECT(하이버네이트 지원) 사용한다. 예) 부모인 Item과 자식 Book이 있다. [JPQL] select i from Item i where treat(i as Book).author = ‘kim’ [SQL] select i.* from Item i where i.DT..
페치 조인 SQL 조인의 종류가 아니라 JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다. join fetch 명령어를 사용한다 엔티티 페치 조인 예) 회원을 조회하면서 연관된 팀도 함께 조회(SQL 한 번에) SQL을 보면 회원 뿐만 아니라 팀(T.*)도 함께 SELECT [JPQL] select m from Member m join fetch m.team [SQL] SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID 예제 시나리오) 페치 조인 사용 코드) String jpql = "select m from Member m join fetch m.team"; List me..
경로 표현식 .(점)을 찍어 객체 그래프를 탐색하는 것 예) select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' 용어 정리 상태 필드: 단순히 값을 저장하기 위한 필드 연관 필드: 연관관계를 위한 필드 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 경로 표현식 특징 상태 필드: 경로 탐색의 끝, 탐색 X JPQL: select m.username, m.age from Member m SQL: select m.username, m.ag..
JPQL 타입 표현 문자: 'HELLO', 'She ''s' 숫자: 10L(Long), 10D(Double), 10F(Float) Boolean: TRUE, FALSE ENUM: jpabook.MemberType.Admin (패키지명 포함!) 엔티티 타입: TYPE(m) = Member (상속 관계에서 사용) 기타 SQL 문법과 거의 같다고 보면 된다. 따라서 아래 식들도 당연히 사용 가능하다. EXIST, IN AND, OR, NOT = > >= 소문자로 바꾼다. LENGTH : 문자의 길이를 반환한다. LOCATE : 특정 문자의 위치를 반환한다. locate('de', 'abcdef') ABS, SQRT, MOD : 절댓값, 루트값, 나눈 나머지 반환한다. SIZE, INDEX(JPA..
조인 내부 조인: SELECT m From Member m [INNER] JOIN m.team t 외부 조인: SELECT m From Member m LEFT [OUTER] JOIN m.team t 세타 조인(cross join): select count(m) from Member m, Team t where m.username = t.name 조인 - ON절 1. 조인 대상 필터링 예) 멤버와 팀을 조인하면서, 팀 이름이 A인 팀만 조인 JPQL: SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A' SQL: SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='..
프로젝션 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로 중복 제거 예) Member member = new Member(); member.setUsername("mem1"); member.setAge(10); em.persist(member); //영속성 컨텍스트를 비움 em.flush(); ..
JPQL 문법 엔티티와 속성은 대소문자 구분한다. JPQL 키워드는 대소문자 구분 안한다. 엔티티 이름 사용, 테이블 이름이 아니다. 별칭은 필수(예: m) (as는 생략가능) 예) select m from Member m where m.age > 18 집합과 정렬 GROUP BY, HAVING, ORDER BY도 전부 사용한다. select COUNT(m), //회원수 SUM(m.age), //나이 합 AVG(m.age), //평균 나이 MAX(m.age), //최대 나이 MIN(m.age) //최소 나이 from Member m TypeQuery와 Query TypeQuery: 반환 타입이 명확할 때 사용 Query: 반환 타입이 명확하지 않을 때 사용 예) Member member = new Mem..