JPA(22)
-
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 -
JPA - @Embedded,@Embeddable 임베디드타입
JPA - @Embedded,@Embeddable 임베디드타입 지금까지는 엔티티에 연관관계를 제외하고는 모두 자바의 기본타입에 해당하는 값만 매핑하였다. 하지만 예를 들어서 주소라는 값을 하나의 엔티티에 매핑하고 싶은데, 도시명,구,동 이렇게 세가지의 기본타입(String)의 값을 매핑해야한다면 과연 3개를 쭉 나열하는 것이 객체지향적인 것인지 3개를 하나의 객체로 묶어서 하나의 객체로 값을 매핑하는 것이 객체지향적인 것인지 고민을 하자만 바로 후자일 것이다. 주소라는 하나의 객체를 만들고 그 안에 도시명,구,동 필드를 넣고 회원이라는 엔티티에는 주소라는 하나의 객체를 레퍼런스함으로써 조금더 객체지향적으로 엔티티를 매핑하는 방법인 것이다. 123456789101112131415161718192021222..
2019.02.04 -
JPA - 영속성 전이(Cascade)와 고아 객체(Orphan)
JPA - 영속성 전이(Cascade)와 고아 객체(Orphan)간단히 설명하면 영속성 전이란, 연관된 엔티티가 영속화되면, 그와 연관된 엔티티까지 모두 영속화시키는것 혹은 하나의 엔티티가 영속성 컨텍스트에서 제거가 된다면, 그와 관련된 엔티티마저 영속성 컨텍스트에서 제거가 되는 것 등의 작업흐름을 영속성 전이라고한다. 즉, 데이터베이스의 Cascade와 같은 의미이다. 고아객체란 하나의 엔티티에서 연관된 엔티티와의 참조가 끊어지면 끊어진 엔티티를 자동으로 삭제해주는 기능이다. 두개를 예제소스로 설명하겠다. 영속성 전이(Cascade = CascadeType.xxx) 우선 예제소스를 설명하기 전에 CascadeType의 종류를 나열한다면, 12345678public enum CascadeType{ ALL..
2019.02.04