개발공부/[Spring]김영한_ORM표준 JPA프로그래밍

[spring]JPQL이 뭔가요?(파라미터와 select)

개발자 덕구🐾 2022. 8. 18. 21:27
728x90

JPQL(Java Persistence Query Language)

 

> 객체 지향 SQL 

 

 

SQL을 추상화한 객체 지향 쿼리 언어이다. 그렇기 때문에 특정 DB SQL에 의존하지 않는다. 

SQL는 DB 테이블을 대상으로 쿼리를 날리지만 JPQL은 엔티티 객체를 대상으로 검색한다.

 

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

 

 

 

 

List<Member> resultList = em.createQuery("select m from Member m where m.name like '%kim%'",
                Member.class)
                .getResultList();

여기서 "select m from Member m ~~" 에서 Member는 테이블을 의미하는 것이 아니고 entity를 의미한다. 

Member.class는 createQuery가 반환할 type을 의미한다. 

 

 

 

1) 결과가 하나 이상일 때는 ?

.getResultList()

> 없으면 빈 리스트를 반환한다.

 

 

 

2) 결과가 하나뿐일 때는 ?

.getSingleResult()

> 없거나 둘 이상이면 Exception이 발생한다. 

 


 

 

 

파라미터는 어떻게 주는거지?

> setParameter로 !!

 

Member Result = em.createQuery("select m from Member m where m.username =:username", Member.class)
                .setParameter("username", "member1")
                .getSingleResult();

 

쿼리를 만들고 쿼리에 username에 member1을 파라미터로 준다. 

그리고 getSingelResult를 통해 얻은 하나 뿐인 result를 구한다. 

 

 

 

이렇게 쿼리문 날라간 엔티티들은 영속성컨텍스트에서 다 관리된다. 

 

 

 

 

 

 

여러 값을 조회할 때 어떻게 하나요?

 

 

여러 방법이 있는데 new 명령어로 조회하는 방법이 있습니다. 

 

new 명령어로 조회하려면 일단 

> DTO를 만듭니다. 

 

public class MemberDTO {

    private String username;
    private int age;

    public MemberDTO(String username, int age) {
        this.username = username;
        this.age = age;
    }

    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;
    }
}

 

 

만든 생성자를 통해서 쿼리에서 select할 수 있습니다. 

 

List<MemberDTO> resultList = em.createQuery("select new hellojpa.MemberDTO(m.name,m.id) from Member m", MemberDTO.class)
                .getResultList();

 

 

 

 

 

 


 

 

 

그럼 JPA에서는 JPQL만 사용할 수 있나?

 

아니다.

JPA는 JPQL과 함께 다양한 쿼리 방법을 지원한다.

native query,  스프링 JDBC 템플릿등을 함께 사용할 수 있다 .

반응형