Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

이러한 서브쿼리는 하드코딩을 없앨수 있는 요소로 활용이 될수 있습니다.


JPQL에서 서브쿼리 사용

JPQL 에서 서브쿼리는 몇가지 제약조건이 있습니다.

  • WHERE , HAVING 절에서만 사용가능
  • SELECT,FROM 절 이후에는 사용불가
Code Block
JPA에서 서브쿼리 사용하기
languagejava
themeEmacs
titleJPQL에서 서브쿼리 사용하기



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);