[JPA] JPQL - 기본 문법과 쿼리 API

·2024년 4월 21일
0

JPA

목록 보기
12/17
post-thumbnail

💡JPQL

  • JPQL은 객체지향 쿼리 언어다.
    ➡️ 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.
  • JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다
  • JPQL은 결국 SQL로 변환된다.
@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String username;
    private int age;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;

		//getter , setter...
}
@Entity
public class Team {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<Member>();
    public Long getId() {
        return id;
    }
}

@Entity
@Table(name = "ORDERS")
public class Order {
    @Id @GeneratedValue
    private Long id;
    private int orderAmount;
    @Embedded
    private Address address;
    @ManyToOne
    @JoinColumn(name = "PRODUCT_ID")
    private Product product;

}
@Entity
public class Product {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private int price;
    private int stockAmound;
}
@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;
}

💡JPQL - 기본 문법과 쿼리API

JPQL의 기본 문법과 쿼리API에 대해 알아보자

📗JPQL 문법

SELECT m FROM Member as m WHERE m.age > 18

  • 엔티티와 속성은 대소문자 구분
    • Member, age
  • JPQL 키워드는 대소문자 구분X
    • SELECT, FROM, WHERE
  • 엔티티 명을 사용한다. 테이블 명이 아니다!(Member)
  • 별칭은 필수(m)
    • as는 생략 가능

📗집합과 정렬

  • count(m) : 회원 수
  • sum(m.age) : 나이 합
  • avg(m.age) : 평균 나이
  • max(m.age) : 최대 나이
  • min(m.age) : 최소 나이
  • group by, having

📗TypeQuery와 Query

  • TypeQuery : 반환 타입이 명확할 때 사용
  • Query : 반환 타입이 명확하지 않을 때 사용
//TypeQuery
TypedQuery<Member> query = 
					em.createQuery("SELECT m FROM Member m", Member.class);
                    
//Query
Query query = em.createQuery("SELECT m.username, m.age FROM Member m");

📗결과 조회 API

  • query.getResultList() : 결과가 하나 이상일 때 리스트 반환
  • query.getSingleResult() : 결과가 정확히 하나일 때 단일 객체
    반환
    • 결과가 없으면 : javax.persistence.NoResultException
    • 결과가 둘 이상이면 : javax.persistence.NonUniqueResultException
//결과가 하나 이상
TypedQuery<Member> query = em.createQuery("SELECT m FROM Meber m", Member.class);
List<Member> resultList = query.getResultList();
//결과가 하나
TypedQuery<Member> query = em.createQuery("SELECT m FROM Meber m WHERE m.id = 10", Member.class);
Member Result = query.getSingleResult();

📗파라미터 바인딩

1. 이름 기준

//username이 member1인 회원 찾기
Member result = 
			em.createQuery("SELECT m FROM Member m WHERE m.username = :username", Member.class)
    		.setParameter("username", "member1")
    		.getSingleResult();
  • :username : 파라미터로 바인딩할 변수명
  • .setParameter("파라미터로 바인딩할 변수명", "바인딩할 문자")

2. 위치 기준

//username이 member1인 회원 찾기
Member result = 
			em.createQuery("SELECT m FROM Member m WHERE m.username = ?1", Member.class)
    		.setParameter(1, "member1")
    		.getSingleResult();

가급적 위치기준은 사용하지 말기
중간에 변수를 끼워넣게 되면 다 순서가 밀림!

profile
백엔드 개발자를 꿈꿉니다 / 이전 블로그 : https://po-dadak.tistory.com/category

0개의 댓글

관련 채용 정보