select m from Member m where m.username = 'rolroralra'
TypedQuery
Query
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
List<Member> resultList = query.getResultList();
Query query1 = em.createQuery("select m.username, m.age from Member m");
Query query2 = em.createQuery("select m.username from Member m");
List<Object[]> resultList1 = query1.getResultList();
List<Object> resultList2 = query2.getResultList();
Query::getResultList
Query:getSingleResult
javax.persistence.NoResultException
javax.persistence.NonUniqueResultException
List<Member> members = em.createQuery(
"select m from Member m where m.username = :username", Member.class)
.setParameter("username", "rolroralra")
.getResultList();
?
다음에 위치 값을 주면 됨List<Member> members = em.createQuery(
"select m from Member m where m.username = ?1", Member.class)
.setParameter("username", "rolroralra")
.getResultList();
SELECT m FROM Member m
SELECT m.team FROM Member m
List<Address> addresses = em.createQuery(
"select m.address from Member m", Address.class)
.getResultList();
List<String> usernames = em.createQuery(
"select m.username from Member m", String.class)
.getResultList();
Double orderMountAvg = em.createQuery(
"select AVG(o.orderAmount) from Order o", Double.class)
.getSingleResult();
Query query = em.createQuery("select m.username, m.age from Member m");
List<Object[]> resultList = query.getResultList();
TypedQuery<UserDTO> query = em.createQuery("select new com.example.UserDTO(m.username, m.age) from Member m", UserDTO.class);
List<Member> members = em.createQuery("SELECT m FROM Member m ORDER BY m.username DESC", Member.class)
.setFirstResult(10)
.setMaxResults(20)
.getResultList();
setFirstResult(int startPosition)
setMaxPesults(int maxResult)
SELECT m FROM Member m [INNER] JOIN m.team t WHERE t.name = :teamName
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
SELECT t, m FROM Team t LEFT JOIN t.members m
SELECT COUNT(m) FROM Member m, Team t
WHERE m.username = t.name
fetch join
의 경우, 별칭을 사용할 수 없다.select m from Member m join fetch m.team
select t from Team t join fetch t.members
select distinct t from Team t join fetch t.members
@ManyToOne
, @OneToOne
, 대상이 엔티티@OneToMany
, @ManyToMany
, 대상이 컬렉션Criteria의 단점을 개선하여 쿼리를 문자가 아닌 코드로 작성해도 간결하고 모양이 쿼리와 비슷하게 개발 할 수 있는 프로젝트
오픈소스 프로젝트
데이터를 조회하는 데 기능이 특화되어있음
시작
기본 Q 생성
검색 조건 쿼리
where 절
에는 and 나 or 사용 가능결과 조회
uniqueResult()
: 조회 결과가 한 건일 때 사용singleResult()
: uniqueResult()
와 같지만 결과가 하나 이상이면 처음 데이터 반환
list()
: 결과가 하나 이상일 때 사용, 결과 없을시 빈 컬렉션 반환
페이징 & 정렬
그룹
조인
innerJoin(join)
, leftJoin
, rightJoin
, fullJoin
사용 및 JPQL 의 성능최적화를 위한 fetch 조인
도 사용할 수 있음join(조인대상, 별칭으로 사용할 쿼리 타입)
서브 쿼리
com.mysema.query.jpa.JPASubQuery
를 생성하여 사용unique()
, 여러 건이면 list()
사용프로젝션 결과 반환
select 절에 조회 대상을 지정 하는 것을 프로젝션이라 함
프로젝션 대상이 하나
여러 컬럼 반환과 튜플
빈 생성
com.mysema.query.types.Projections
사용수정, 삭제, 배치 쿼리
동적 쿼리
com.mysema.query.BooleanBuilder
사용하여 특정 조건에 따른 동적 쿼리 생성메소드 위임
JPQL은 특정 데이터베이스에 종속적인 기능은 지원하지 않음
특정 데이터베이스만 지원하는 함수, 문법, SQL 쿼리 힌트
인라인 뷰(From 절에서 사용하는 서브쿼리), UNION, INTERSECT
스토어드 프로시저
JPQL을 사용할 수 없을 때 JPA는 SQL을 직접 사용할 수 있는 기능을 제공하는데 이를 네이티브 SQL이라 함
네이티브 SQL을 사용하면 엔티티를 조회할 수 있고 JPA가 지원하는 영속성 컨텍스트의 기능을 그대로 사용할 수 있음