Named 쿼리 - 정적 쿼리 미리 정의해서 이름을 부여해두고 사용하는 JPQL 정적 쿼리 어노테이션, XML에 정의 애플리케이션 로딩 시점에 초기화 후 재사용 애플리케이션 로딩 시점에 쿼리를 검증 Member Entity @Entity @NamedQuery( name="Member.findByUsername", query="select m from Member m where m.username =:username" // 만약 문제있는 쿼리라면 컴파일 시점에 에러를 내줌. ) public class Member { @Id @GeneratedValue private Long id; private String username; JpaMain List resultList = em.createNamedQuery..
JPQL

경로 표현식 용어 정리 경로 표현식: .(점)을 찍어 객체 그래프를 탐색하는 것 상태 필드 단순히 값을 저장하기 위한 필드 ex) m.username 경로 탐색의 끝, 탐색X 연관 필드(association field): 연관관계를 위한 필드 단일값 연관 필드 @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) 묵시적 내부 조인(inner join) 발생, 탐색O 컬렉션 값 연관 필드 @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders) 묵시적 내부 조인 발생, 탐색X FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색 가능 쿼리에서 t.members.username 이런 식으로 사용할 수 없음(탐색X) 실무 조언 가급적 묵시적 조인..
조건식 기본 CASE 식 String query = "select " + "case " + "when m.age = 60 then '경로요금' " + "else '일반요금' " + "end " + "from Member m"; List result = em.createQuery(query,String.class).getResultList(); 단순 CASE 식 String query = "select " + "case t.name " + "when '팀A' then '인센티브110%' " + "when '팀B' then '인센티브120%' " + "else '인센티브105%' " + "end " + "from Team t"; List result = em.createQuery(query,String.cl..

프로젝션 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 m.username, m.age FROM Member m Query 타입으로 조회 Object[] 타입으로 조 회 new 명령어로 조회 단순 값을 DTO로 바로 조회 SELECT new j..