JPA 사용이 가능하며
JPA 사용시 앤테티 객체를 중심으로 개발한다
단, 검색쿼리 작성시 어렵다
검색쿼리시 테이블이 아닌 엔티티 객체를 대상으로 검색&조회 해야한다
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
SQL 과 문법 유사, DDL , where , having join 등
JPQL은 엔티티 객체를 대상으로 쿼리
= 테이블 명 대신 엔티티 명을 사용한다. @Entitiy(name = "" ) 으로 따로 설정은 가능하다
= 지정하지 않는다면 [ 클래스 이름 ] 이 곧 @Entitiy name 속성이 된다
= JPQL에서는 별칭이 필수 이다.
( 단, as 는 생략가능 )
public class Jpa_Main(){ EntitiyManagerFactory emf = Persistence.createENtityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntitiyTransaction tx = em.getTransaction(); tx.begin() tx.commit(); try{ //em.createQuery(String, qlString) em.createQuery("!JPQL", Member.class); em.createQuery(" select m from Member m where m.username like '%kim%'" // * 로 호출하는 것이 아닌 as 통해 호출 , Member.class).getResultList(); // = 결과 값은 List 형태로 담긴다 for (Member member : result){ System.out.println("member = " + member ); } }catch{ tx.rollback() }finally{ em.close(); emf.close(); } }
@Entity( name = "" ) public class Member{ @Entity 어노테이션에 name 속성을 추가로 설정할 수 있으나, 기본값이 클래스 명이기에 그냥 클래스명을 쓰면 된다 ( 굳이 할 필요없다 ) }
count(m)
sum(m.age)
avg(m.age)
select 한 결과 값 타입이 ( 반환타입이 )
명확한 경우 사용한다
ex ) 반환 타입이 명확할 때
TypedQuery<Member> query =
(" select m from member m" , Member.class);
TypedQuery<String> query =
(" select m.username from member m" , String.class);
Query
Query query =
(" select m.username, m.age from member m" , Member.class);
m.username = String
m.age = int
query 안에 담겨진 List 결과값을 반환
결과 값이 없다면 빈 리스트가 반환 ( null 값 아님 )
빈 collection 이 반환되기 때문에 nullPointerException 에 대한 걱정은 안해도 된다
조회 할 결과 값이 딱 하나 일 때, ( 단일 객체를 조회할 경우 ) 사용
결과 값이 없을경우 exception 발생 -> NoResultException 예외처리 발생
또는 결과값이 2개 이상일 경우 exception 발생 -> NonUniqueException 예외처리 발생