본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA

JPA 공부 13 - 직접 쿼리를 작성하는 방법

반응형

 

JPA를 사용하면 엔티티 객체를 중심으로 개발하게 되는데 문제는 검색 쿼리이다 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색을 해야한다. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하기 떄문에 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다 .

 

 

1.JPQL

 

이런 문제를 해결하기 위해 SQL 을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다 SQL 문법의 문법을 지원한다. 

 

JPQL은 데이터베이스 테이블을 대상으로 쿼리를 날리는 SQL 과는 달리 엔티티 객체를 대상으로 쿼리를 날리는 것이다.

 

JPQL로 짜면 그게 SQL로 번역되서 쿼리가 날라간다.  

 

EntityManager에 createQuery( JPQL쿼리 , 검색하는 엔티티 타입)메서드로 생성한다 . 

 

List<Member> resultList = em.createQuery(
       "select m from Member m where m.name like '%ugo%'", Member.class
).getResultList();

 

 

2.Criteria

 

쿼리를 자바코드로 짠다 . 컴파일 시점에서 오류를 잡아낼 수 있고  ,동적 쿼리를 짜기 쉽다는 장점이 있다. 

단점은 SQL 스럽지 않고 복잡하여 실용성이 없다.

 

//빌더를 가져오고
CriteriaBuilder cb = em.getCriteriaBuilder();

//타입 지정
CriteriaQuery<Member> query = cb.createQuery(Member.class);

//쿼리 생성
Root<Member> m = query.from(Member.class);

//username  을 가져와서 kim 이랑 같은 사람을 가져온다 
CriteriaQuery<Member> cq = query.select(m).where(cb.equal(m.get("username"), "kim"));
List<Member> resultList = em.createQuery(cq).getResultList();

 

 

3.QueryDSL

 

  쿼리를 만들어주는 오픈소스 라이브러리다 Criteria보다 훨씬 , 간결하고 직관적이어서 사용하기 편하다. 셋팅이 좀빢세다.

 

4.native query

 

SQL을 직접 작성하여 사용할 수 있다.  JPQL로 해결할 수 없는 특정 DB에 종속적인 쿼리를 짤 때 사용한다 

 

예) 오라클 Connect by  

 

 

String query = "select * from member where name like '%user1% '";
List resultList = em.createNativeQuery(query).getResultList();

 

 

4.JDBC 직접 사용 

 

JPA를 사용하면서 SpringJdbcTemlate , Mabatis를 함께 사용할 수 있다 . 단 영속성 컨텍스트를 적절한 시점에 강제로 플러시 할 필요가 있다.  

만약 Member 인스턴스를 생성하고 persist 했다고해면 트랜잭션 커밋이 일어나거나 ,  em.craeteQuery 가 호출 될때 flush가 되지만  Mabatis ,SpringJdbcTemlate는 JDBC connection을 직접 얻어다 쓰기 떄문에 영속성 컨텍스트의 관리를 받지 않아  멤버 생성 후에 강제로 flush 호출하지 않는다면 , member 가 저장 됬는지 알수가 없다 . JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 수동 플러시 해줘야한다. 

반응형