# 기본 문법과 쿼리 API

* JPQL은 객체지향 쿼리 언어다.따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.
* JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하 지 않는다.
* JPQL은 결국 SQL로 변환된다.update문, delete문 : 벌크 연산. 한번에 여러개를 연산할 때.

![객체 모델과 DB 모델](/files/-MeiHuTMYUb2vnaOYGxD)

JPQL 문법

```sql
select_문 :: = 
    select_절
    from_절
    [where_절]
    [groupby_절]
    [having_절]
    [orderby_절]

update_문 :: = update_절[where_절]
delete_문 :: = delete_절 [where_절]
```

```java
• select m from Member as m where m.age > 18
```

* 엔티티와 속성은 대소문자 구분O (Member, age)
* JPQL 키워드는 대소문자 구분X (SELECT, FROM, where)
* 엔티티 이름 사용, 테이블 이름이 아님(Member) **별칭**은 필수(**m**) (as는 생략가능)

집합과 정렬

* GROUP BY
* HAVING ORDER BY

```sql
select
    COUNT(m), //회원수
    SUM(m.age), //나이 합
    AVG(m.age), //평균 나이
    MAX(m.age), //최대 나이
    MIN(m.age) //최소 나이
from Member m
```

TypeQuery와 Query⭐️⭐️⭐️⭐️⭐️

* TypeQuery: 반환 타입이 명확할 때 사용
* Query: 반환 타입이 명확하지 않을 때 사용

결과 조회 API

* query.getResultList(): 결과가 하나 이상일 때, 리스트 반환\
  결과 없으면 빈 리스트 반환(NullPointerException은 걱정 안해도 됨.)
* query.getSingleResult() \
  select m from Member as m where m.id==...\
  이렇게 식별자 값을 정해서 결과가 정확히 하나의 단일 객체를 반환할 때\
  결과가 없으면 : javax.persistence.NoResultException\
  둘 이상이면 : javax.persistence.NonUniqueResultException\
  Spring Data JPA => 결과가 없으면 Exception이 아니라 null 또는 optional 반환.

파라미터 바인딩 - 이름 기준

```java
TypedQuery<Member> query = em.createQuery("select m from Member as m where m.username = :username", Member.class);//TypeQuery라는 제네릭을 반환한다! 왜냐하면 타입정보를 명확하게 줬기 때문!
query.setParameter("username","member1");
Member singleResult = query.getSingleResult();
System.out.println("singleResult = " + singleResult);
```

보통 아래처럼 체인메서드로 사용한다.

```java
Member result = em.createQuery("select m from Member as m where m.username = :username", Member.class)
  .setParameter("username", "member1")
  .getSingleResult();
            System.out.println("result = " + result);
```

파라미터 바인딩 - 위치 기준\
잘 사용하지 않는다. 인덱스가 중간에 삽입되면 장애 발생하기 때문!

```java
SELECT m FROM Member m where m.username=?1
query.setParameter(1, usernameParam);
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://heunnajo.gitbook.io/jpa-basic/10.-1/api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
