JPA 에서 지금까지 조회를 할떄 find() 을 이용해 간단한 검색만 해왔다.
하지만 조금더 복잡하고 디테일하게 쿼리를 어떻게 작성할까???
예를들어 Member중 age가 20이상인 회원을 검색한다면?
검색을 할떄 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
JPQL =엔티티객 체 대상 / SQL 데이터베이스 테이블 대상
모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검
색 조건이 포함된 SQL이 필요
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
기존 SQL 문법과 매우 흡사하다.
JPQL은 결국 SQL로 변환된다.
SQL을 추상화해서 특정 데이터베이스 SQL에 의존X
JPA가 제공하는 SQL을 직접 사용하는 기능(기존 SQL처럼 쿼리를 짜면된다)
JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능
예) 오라클 CONNECT BY, 특정 DB만 사용하는 SQL 힌트
보통 JPQL 을 사용하면 Flush() 가 먼저 사용되고 JPQL이 실행된다. (Flush는 영속성 컨텍스트 1차캐시에 있는 데이터를 DB에 넣어준다)
여기서 JDBC의 문제가 발생한다. JDBC 쿼리문은 DB에서 데이터를 찾기 시작하지만 아직 데이터는 1차캐시에 있어서 데이터가 나오지 않는다.
JDBC는 Flush가 자동으로 실행되지 않아 데이터는 아직 1차캐시에 있다.
프로젝트를 새로 만들어 실습했다.
............오류 하나 넘어가니 또 오류가 발생했다. 구글링!!
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가 없어서 일어난 일이다. 적절한 디펜던시를 추가해주자!
- query.getResultList(): 결과가 하나 이상일 때, 리스트 반환
결과가 없으면 빈 리스트 반환, 널포인트 걱정 x
- query.getSingleResult(): 결과가 정확히 하나, 단일 객체 반환
- 결과가 없으면: javax.persistence.NoResultException
- 둘 이상이면: javax.persistence.NonUniqueResultException
setParameter("쿼리안에서 이름", value)
파라미터 숫자위치는 쓰지말자 중간에 하나생성되면 다밀린다. 대신 문자는 괜찮다 밀리지도 않고
-> Spring Data JPA 를 먼저 배우고 JPA 를 배우니 비슷한 기능들이 많았다. 확실히 어떻게 발전되었는지 배웠고 어떤게 더 편해졌는지 확실히 느꼈다.