@Entity(name="")
으로 설정 가능AS
는 생략할 수 있다.SELECT문
select
절
from
절
where
절
group by
절
having
절
orderby
절
select m from Member as m where m.age > 18
Member
, age
)select
, from
, where
)UPDATE문
update
절
where
절
DELETE문
delete
절
where
절
집계함수
select count(m) // 회원수 sum(m.age) // 나이 합 avg(m.age) // 나이 평균 max(m.age) // 나이 최대값 min(m.age) // 나이 최소값 from Member m
TypeQuery<Member> query = em. createQuery("select m from Member m", Member.class);
Query query = em.createQuery("select m.username, m.age from Member m");
collection
이 반환되기 때문에 NullPointerException
에 대한 걱정은 하지 않아도 된다.javax.persistence.NoResultException
javax.persistence.NonUniqueResultException
발생select m from Member m where m.username = :username query.setParameter("username",usernameParam); // 메시지 체인 방식 예시 Member result = em.createQuery("select m from Member m where m.username = :username", Member.class) .setParameter("username","member1") .getSingleResult();
// 권장되지 않음 select m from Member m where m.username = ?1 query.setParameter(1,usernameParam);
프로젝션 : SELECT
절에 조회할 대상을 지정하는 것
대상별 프로젝션
엔티티 프로젝션
// Member 엔티티 조회 List<Member> result = em.createQuery("select m from Member m", Member.class) .getResultList(); // Member와 관련된 Team 조회(실제 sql 입장에서는 join결과가 발생) // 직관적이지 않아 권장하지 않음 List<Team> result2 = em.createQuery("select m.team from Member m", Team.class) .getResultList(); // join문으로 Team 조회 List<Team> result2 = em.createQuery("select t from Member m join m.team t", Team.class) .getResultList();
임베디드 타입 프로젝션
// 직접 가져올 수 없고 o.address가 소속되어 있는 엔티티에서 가지고 와야 한다 em.createQuery("select o.address from Order o", Address.class) .getResultList();
스칼라 타입 프로젝션
// 여러 값 조회 - 1단계 List resultList = em.createQuery("select m.username, m.age from Member m") .getResultList(); // 타입을 지정하지 못하므로 object 받아오기 Object[] result1 = (Object[])resultList.get(0); // 여러 값 조회 - 2단계 List<Object[]> resultList2 = em.createQuery("select m.username, m.age from Member m") .getResultList(); Object[] result2 = resultList2.get(0); // 여러 값 조회 - 3단계(DTO 사용 / 가장 권장) // 생성자를 호출하는 듯한 문법, 패키지 경로까지 명시 List<MemberDTO> result3 = em.createQuery ("select new com.codingbox.jpql.MemberDTO(m.username, m.age) from Member m") .getResultList(); MemberDTO memberDTO = result3.get(0);
0
부터 시작)// 나이순으로 멤버 조회 String jpql = "select m from Member m order by m.age desc"; // 10번째 자료부터 20개 자료 조회 List<Member> resultList = em.createQuery(jpql,Member.class) .setFirstResult(10) .setMaxResults(20) .getResultList(); // 20개 크기의 멤버 리스트가 조회됨 System.out.println("result.size : " + resultList.size()); for(Member member : resultList) { System.out.println("member = " + member); }
select m from Member m [inner] join m.team t
select m from Member m left [outer] join m.team t
select count(m) from Member m, Team t where m.username = t.name
select m from Member m where m.age > (select avg(m2.age) from Member m2)