JPQL with Errors...

Shaun·2021년 11월 4일
1

JPA

목록 보기
25/31

JPA 에서 지금까지 조회를 할떄 find() 을 이용해 간단한 검색만 해왔다.

하지만 조금더 복잡하고 디테일하게 쿼리를 어떻게 작성할까???

예를들어 Member중 age가 20이상인 회원을 검색한다면?

JPQL

  • 검색을 할떄 테이블이 아닌 엔티티 객체를 대상으로 검색한다.

  • JPQL =엔티티객 체 대상 / SQL 데이터베이스 테이블 대상

  • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능

  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국
    색 조건이 포함된 SQL이 필요

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

  • 기존 SQL 문법과 매우 흡사하다.

  • JPQL은 결국 SQL로 변환된다.

  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존X

Native Query

  • JPA가 제공하는 SQL을 직접 사용하는 기능(기존 SQL처럼 쿼리를 짜면된다)

  • JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능

  • 예) 오라클 CONNECT BY, 특정 DB만 사용하는 SQL 힌트

JDBC 직접사용, SpringJdbcTemplate

  • JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링
    JdbcTemplate, 마이바티스등을 함께 사용 가능

  • 예전에 영속성 컨텍스틀 공부할때 Flush가 나가는 조건이 세가지가 있다고 했다. 강제 flush() , commit() , JPQL 사용시
  • 보통 JPQL 을 사용하면 Flush() 가 먼저 사용되고 JPQL이 실행된다. (Flush는 영속성 컨텍스트 1차캐시에 있는 데이터를 DB에 넣어준다)

  • 여기서 JDBC의 문제가 발생한다. JDBC 쿼리문은 DB에서 데이터를 찾기 시작하지만 아직 데이터는 1차캐시에 있어서 데이터가 나오지 않는다.

  • JDBC는 Flush가 자동으로 실행되지 않아 데이터는 아직 1차캐시에 있다.

영속성 컨텍스트 링크

JPQL 실습

프로젝트를 새로 만들어 실습했다.

  • 해당 테이블을 만드는 과정은 생략하고 혹시나 해서 내 깃허브 링크를 남겨둔다.

JPQL실습 엔티티만들기

  • 기존 프로젝트를 썻다가 지우고 계속 쓰다보니.... 프로젝트를 새로 만들어서 한건 조금 오랜만이라 오류가 났다..

  • 에러에는 역시 구글링 만한게 없다... 구글링을 해보니 maven 프로젝트는 따로 설정하지 않는 이상 자바 default 버전으로 1.5를 쓴댄다. 이걸 8 로 바꿔주고 apply하면....

............오류 하나 넘어가니 또 오류가 발생했다. 구글링!!

JAXB

  • Java Architecture for XML Bind을 뜻한다.

  • 우리는 Maven 형식으로 프로젝트를 구성할때 등등 프로젝트를 하면서 많은 xml을 사용하는데 xml을 java Object 형식으로 바꿔주는 역할을 하는 기술이 JAXB 였다.

참고페이지:링크텍스트

왜 이 오류가 일어났을까??

JAXB(Java Architecture for XML Binding)는 Java6에서 2.0버전으로 내장되었고, Java9에서 모듈화 방식을 사용하면서 vm옵션을 통해 모듈을 추가(--add-modules java.xml.bind)해야 사용 가능하였고, Java11부터는 결국 제거되었습니다.

-> 결국에는 JAXB가 없어서 일어난 일이다. 적절한 디펜던시를 추가해주자!

  • 정상적으로 작동한다.

TypeQuery, Query /결과 조회 API

  • TypeQuery: 반환 타입이 명확할때
  • 두번쨰 파라미터에는 타입 정보를 줄수 있다. 그래서 보면 제네릭이 사용 된걸 볼수 있다.

  • Query: 반환 타입이 불명확 할때

결과 조회 API

  • query.getResultList(): 결과가 하나 이상일 때, 리스트 반환
    결과가 없으면 빈 리스트 반환, 널포인트 걱정 x
  • query.getSingleResult(): 결과가 정확히 하나, 단일 객체 반환
  • 결과가 없으면: javax.persistence.NoResultException
  • 둘 이상이면: javax.persistence.NonUniqueResultException

파라미터 바인딩 이름,위치 기준

  • setParameter("쿼리안에서 이름", value)

  • 파라미터 숫자위치는 쓰지말자 중간에 하나생성되면 다밀린다. 대신 문자는 괜찮다 밀리지도 않고

  • 이렇게 깔끔하게 정리해서 코드를 작성 할수도 있다.

-> Spring Data JPA 를 먼저 배우고 JPA 를 배우니 비슷한 기능들이 많았다. 확실히 어떻게 발전되었는지 배웠고 어떤게 더 편해졌는지 확실히 느꼈다.

profile
호주쉐프에서 개발자까지..

0개의 댓글