Spring Boot - JPQL

UnKnown12·2022년 12월 9일
0

Spring Boot

목록 보기
9/13

📌 JPQL

  • JPA 사용이 가능하며
    JPA 사용시 앤테티 객체를 중심으로 개발한다

  • 단, 검색쿼리 작성시 어렵다

  • 검색쿼리시 테이블이 아닌 엔티티 객체를 대상으로 검색&조회 해야한다

  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공

  • SQL 과 문법 유사, DDL , where , having join 등

  • JPQL은 엔티티 객체를 대상으로 쿼리

📌 규칙

엔티티 이름

= 테이블 명 대신 엔티티 명을 사용한다. @Entitiy(name = "" ) 으로 따로 설정은 가능하다
= 지정하지 않는다면 [ 클래스 이름 ] 이 곧 @Entitiy name 속성이 된다

❗ 별칭은 필수 ( as )

= 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();
        }
   

    }

📌 JPQL 문법

  • select
    • from
    • select
    • where
    • group by
    • having
    • order by
  • update
    • update
    • where
  • delete
    • delete
    • where
	@Entity( name = "" ) 
	public class Member{

   		@Entity 어노테이션에 name 속성을 추가로 설정할 수 있으나,
        기본값이 클래스 명이기에 그냥 클래스명을 쓰면 된다 ( 굳이 할 필요없다 ) 
    }

📌 JPQL 집계함수

일반 SQL문과 달리 JPQL 에서는

* 을 사용하지않고 as 이름 명으로 직접 호출해야한다

Ex)

  • count(m)

  • sum(m.age)

  • avg(m.age)

📌 TypedQuery , Query

TypedQuery

  • select 한 결과 값 타입이 ( 반환타입이 )
    명확한 경우 사용한다

  • ex ) 반환 타입이 명확할 때

	TypedQuery<Member> query = 
		(" select m from member m" , Member.class);
    TypedQuery<String> query = 
		(" select m.username from member m" , String.class);
    Query 
  • ex ) 반환타입이 명확하지 않을 때
    = 리턴을 String, int 등 복수 타입으로 리턴받을 경우 Query 를 사용한다
	Query query = 
		(" select m.username, m.age from member m" , Member.class);
        m.username = String
        m.age = int 

결과조회

query.getResultList();

  • query 안에 담겨진 List 결과값을 반환
    결과 값이 없다면 빈 리스트가 반환 ( null 값 아님 )

  • 빈 collection 이 반환되기 때문에 nullPointerException 에 대한 걱정은 안해도 된다

query.getSingleResult();

  • 조회 할 결과 값이 딱 하나 일 때, ( 단일 객체를 조회할 경우 ) 사용

  • 결과 값이 없을경우 exception 발생 -> NoResultException 예외처리 발생
    또는 결과값이 2개 이상일 경우 exception 발생 -> NonUniqueException 예외처리 발생

profile
Hyobin12

0개의 댓글