Page History
...
이러한 서브쿼리는 하드코딩을 없앨수 있는 요소로 활용이 될수 있습니다.
JPQL에서 서브쿼리 사용
JPQL 에서 서브쿼리는 몇가지 제약조건이 있습니다.
- WHERE , HAVING 절에서만 사용가능
- SELECT,FROM 절 이후에는 사용불가
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
JPA Query 호출방법
JPA에서 전략에따라, 다양한 방법으로 쿼리문 수행이 가능하다란것을 알아보았습니다.
JPA의 Repository Interface를 활용했을때 QueryMethod/JPQL 로만 충분히 다양한 SQL문 처리가 가능 한것을 살펴보았지만
SQL문을 Builder하는 몇가지 방법을 더 살펴보겠습니다. ( Criteria / QueryDSL)
Query Method
No Format |
---|
findByAgeGreaterThan(int age);
findBySex(String sex); |
JPA가 지원한는 Repository 인터페이스 내에서, 정의된 함수 네이밍이 검색 쿼리를 지원합니다.
어플리케이션에서도 자주 사용하는,검색 조건 3가지 이내 비교적 간단한 SQL문으로 유추되는 검색조건
에서 유용합니다.
JPQL
No Format |
---|
@Query("select new com.example.demo.data.AddressStatistics(t.address,AVG(t.age))
from Address t where t.age > :minage
GROUP BY t.address HAVING AVG(t.age) > :filterage ")
List<AddressStatistics> findRegionAvgage(
@Param("minage") int minage,
@Param("filterage") double filterage
) |
SQL문이 비교적 복잡해지면, 작동 함수에 직접 Query문을 매칭시켜 작성가능합니다.
nativeQuery=false 옵션에따라 JPQL or NativeQuery 선택이 가능합니다.
만약 오라클에만 있는 Connect BY기능을 사용하려면 NativeQuery를 사용해야합니다.
Criteria Query
No Format |
---|
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> query = cb.createQuery(Member.class);
Root<Member> m = query.from(Member.class);
CreteriaQuery<Member> cq = query.select(m).where(cb.equal(m.get("username","kim"));
List<Member> resultList = em.createQuery(cq).getResultList(); |
JPQL문을 직접 만들수 있는 JPQL빌드 입니다.
동적 쿼리작성에 편하지만 복잡하고 가독이 어려운 단점이 있습니다.
동일한 목표를 가지고, 가독성이 더좋은 Query DSL이 권장됩니다.
Query DSL
No Format |
---|
JPAQuery query = new JPAQuery(em);
QMember = member = Qmember.member;
List<Member> members =
query.from(member)
.where(member.username.eq("Kim"))
.list(member);
|