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 템플릿등을 함께 사용할 수 있다 .
반응형
'개발공부 > [Spring]김영한_ORM표준 JPA프로그래밍' 카테고리의 다른 글
영속성 컨텍스트, 엔티티의 생명주기 (0) | 2022.08.23 |
---|---|
[애플리케이션 개발]persistence_entityManagerFactory, 엔티티 생성 (0) | 2022.08.23 |
[spring] 양방향 연관관계&연관관계의 주인 (0) | 2022.08.18 |
[spring]단방향 연관관계 (0) | 2022.08.18 |
[매핑 어노테이션]@Entity, @Table, @Enumerated, @Id, @GeneratedValue, @Temporal,@Lob (0) | 2022.08.18 |