Web/JPA(24)
-
JPA - QueryDSL, JPQL Query Builder Class
JPA - QueryDSL, JPQL Query Builder Class 이전 포스팅에서 다뤘던 JPA Criteria는 문자가 아닌 코드로 JPQL을 작성하도록 도와주는 쿼리빌더였기 때문에 문법 오류를 컴파일 단계에서 잡을 수 있고 IDE툴을 이용하여 자동완성 기능의 도움을 받을 수 있기 때문에 여러가지 장점이 있었다. 하지만 Criteria의 가장 큰 단점은 코드양이 줄지도 않고 너무 복잡하며 바로바로 쿼리를 예상하기가 쉽지 않았다. 하지만 이번에 다룰 QueryDSL은 Criteria와 같이 문자가 아닌 코드로 쿼리를 작성하며, 쉽고 간결하고 빌더로 작성된 모양도 쿼리와 비슷해 쉽게 예상이 가능하다. 오히려 Criteria보다 사용하기 편하다. 하지만 큰 문제라고는 할 수 없지만 Criteria는 ..
2019.02.11 -
JPA - Criteria Query(객체지향 쿼리 빌더), JPQL Query Builder Class
JPA - Criteria Query(객체지향 쿼리 빌더), JPQL Query Builder Class Criteria 쿼리는 JPQL을 자바 코드로 작성하도록 도와주는 빌더 클래스 API이다. Criteria를 사용하면 문자가 아닌 코드로 JPQL를 작성하므로 문법 오류를 컴파일 단계에서 잡을 수 있고 문자 기반의 JPQL보다 동적 쿼리를 안전하게 생성할 수 있다. 하지만 이번에 Criteria를 간단하게만 다루려고 한다. 이유는 실제 Criteria를 사용해서 개발하다보면 코드가 복잡하고 장황하며 직관적으로 이해하기 힘들다는 단점이 있기때문이다. 다음 포스팅에서는 코드로 쿼리를 작성할 수 있고 간단한 QueryDSL을 다음에 자세히 다뤄볼 예정이기에 이번 포스팅은 몇가지 간단하게만 다뤄본다. Cri..
2019.02.09 -
JPA - @NamedQuery , 정적 쿼리
JPA - @NamedQuery , 정적 쿼리 JPA는 크게 동적쿼리와 정적 쿼리로 나뉜다. 그 중에 정적쿼리(@NamedQuery)는 애플리케이션 로딩 시점에 JPQL 문법을 체크하고 미리 파싱해둔다. 따라서 오류를 빨리 확인할 수 있고, 사용하는 시점에는 파싱된 결과를 재사용하므로 성능상 이점도 있다. 그리고 정적쿼리는 변하지 않는 정적 SQL이 생성되므로 데이터베이스의 조회 성능상 최적화에 도움이된다. 왜냐하면 데이터베이스는 내부적으로 한번 사용된 쿼리는 캐싱? 해놓기 때문에 다음에 동일한 쿼리가 있을 경우 재사용하기 때문이다. @NamedQuery 123456789101112131415161718192021222324252627282930313233343536373839404142434445464..
2019.02.09 -
JPA - JPQL 서브쿼리 (객체지향 쿼리 언어)
JPA - JPQL 서브쿼리 (객체지향 쿼리 언어),컬렉션 식JPQL도 서브 쿼리를 지원하지만 몇 가지 제약사항이 존재한다. -WHERE, HAVING 절에서만 사용할 수 있고, SELECT,FROM절에서는 사용할 수 없다. 1234567891011121314151617/* * 서브쿼리 - SQL과 다르게 where,having 절에서만 사용가능하다. */public void subQuery() { String jpql = "select m from MemberJPQL m where m.age > (select avg(m2.age) from MemberJPQL m2)"; TypedQuery query = em.createQuery(jpql,MemberJPQL.class); List teams = quer..
2019.02.09 -
JPA - JPQL 조인(객체지향쿼리),Java Persistence Query Language
JPA - JPQL 조인(객체지향쿼리),Java Persistence Query Language JPQL 조인은 SQL 조인과 기능은 거의 같고 문법만 약간 다르다. 내부 조인(inner join) 12345678910111213141516171819202122232425/* * 내부조인 */public void innerJoin() { String jpql = "select m,t " + "from MemberJPQL m inner join m.team t " + "where t.name = '티스토리1' " ; Query query = em.createQuery(jpql); List members = query.getResultList(); System.out.println("=============..
2019.02.09 -
JPA - JPQL(객체지향쿼리),Java Persistence Query Language
JPA - JPQL(객체지향쿼리)(예제소스파일/ jpql package참조) JPQL은 가장 중요한 객체지향 쿼리 언어이다. Criteria나 QueryDSL은 결국 JPQL을 편리하게 사용하도록 도와주는 기술이므로 JPA로 데이터베이스 엑세스를 다룬다면 JPQL은 꼭 필수라고 생각이 든다. SQL과 꼭 닮은 쿼리 언어이며 SQL은 데이터 중심의 쿼리라고 하면 JPQL은 엔티티를 대상으로 하는 쿼리 언어라고 할 수 있다. 결국 JPA에서 해당 JPQL을 분석한 다음 적절한 SQL로 변환해주어서 데이터베이스에서 데이터를 가져오는 것이다.JPQL 특징1. 엔티티 객체를 조회하는 객체지향 쿼리이다.(테이블 대상이 아니다.)2. JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다.(데이터베이스 방..
2019.02.09