코드 그라데이션

JPQL - 기본 문법과 기능 본문

Spring/JPA 공부

JPQL - 기본 문법과 기능

완벽한 장면 2023. 8. 29. 03:01

JPQL 소개

 

 

기본 예제

새로운 프로젝트로 진행


초기 세팅 값

Address

@Embeddable
public class Address {

  private String city;
  private String street;
  private String zipcode;

  public String getCity() {
    return city;
  }

  public void setCity(String city) {
    this.city = city;
  }

  public String getStreet() {
    return street;
  }

  public void setStreet(String street) {
    this.street = street;
  }

  public String getZipcode() {
    return zipcode;
  }

  public void setZipcode(String zipcode) {
    this.zipcode = zipcode;
  }
}

 

Member

@Entity
public class Member {

  @Id
  @GeneratedValue
  private Long id;

  private String username;
  private int age;

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

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}

 

Team

@Entity
public class Team {

  @Id
  @GeneratedValue
  private Long id;

  private String name;

  // 양방향으로 만들기
  @OneToMany(mappedBy = "team")
  private List<Member> members = new ArrayList<>();

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

 

Order

@Entity
@Table(name = "ORDERS")
public class Order {

  @Id
  @GeneratedValue
  private Long id;

  private int orderAmount;

  @Embedded
  private Address address;

  // Order -> Product 단방향 매핑
  @ManyToOne
  @JoinColumn(name = "PRODUCT_ID")
  private Product product;
}

 

Product

@Entity
public class Product {

  @Id
  @GeneratedValue
  private Long id;

  private Long name;

  private int price;

  private int stockAmount;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public Long getName() {
    return name;
  }

  public void setName(Long name) {
    this.name = name;
  }

  public int getPrice() {
    return price;
  }

  public void setPrice(int price) {
    this.price = price;
  }

  public int getStockAmount() {
    return stockAmount;
  }

  public void setStockAmount(int stockAmount) {
    this.stockAmount = stockAmount;
  }
}

 

JPQLMain

public class JpqlMain {

  public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();

    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {

      tx.commit();
    } catch (Exception e) {
      tx.rollback();
      e.printStackTrace();
    } finally {
      em.close();
    }
    emf.close();
  }

}

 


JPQL 문법

  • 사실상 SQL과 똑같다고 보는 것이 속 편하다.

 

설명

 

 

집합과 정렬

 

 

TypeQuery, Query

 

결과 조회 API

 

//이렇게 하면 반환이 타입 쿼리의 제네릭으로 들어간다.
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
List<Member> memberList = query.getResultList(); // 컬렉션이 반환 될 거야를 알려줌

for (Member member1 : memberList) { //출력하기
  System.out.println("member1 = " + member1);
}
// 값이 무조건 하나라면, 단일 객체 반환
TypedQuery<Member> query = em.createQuery("select m from Member m where m.id = 10", Member.class);
Member singleResult = query.getSingleResult();
System.out.println("singleResult = " + singleResult);

 

 

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

  • 이름 기준만 쓴다. 위치 기준은 그냥 없다고 생각해라.

 

이름 기준 예시

TypedQuery<Member> query 
	= em.createQuery("select m from Member m where m.username = :username", Member.class);
query.setParameter("username", "member1");
Member singleResult = query.getSingleResult();
System.out.println("singleResult = " + singleResult.getUsername());

 

실행 창을 보면

결과 확인 가능.

 

그런데 실무에서는 이렇게 변거롭게 쓰지 않고, 메서드 체인으로 활용해서  한 번에 엮어서 정리한다.

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

 

 

728x90

'Spring > JPA 공부' 카테고리의 다른 글

ORM에 대한 궁금증과 오해  (3) 2024.03.16
실전 예제 6. 값 타입 매핑  (0) 2023.08.28
값 타입 컬렉션  (0) 2023.08.27
값 타입의 비교  (0) 2023.08.27
값 타입과 불변 객체  (0) 2023.08.26
Comments