📦 Database/JPQL
JPQL Named Query & Parameter Binding
신건우
2023. 4. 16. 01:03
💡 Named 쿼리 - 정적 쿼리
- 엔티티 클래스에 미리 정의해서 이름을 부여해두고 사용하는 JPQL
- 쿼리에 이름을 부여하며, 이름을 통해 쿼리를 불러오기가 가능하다.
- 어노테이션, XML에 정의 (XML이 항상 우선권을 가진다.)
- 어플리케이션 로딩 시점에 초기화 후 재사용 (SQL 로 파싱하여 쿼리를 캐싱함)
- 어플리케이션 로딩 시점에 쿼리를 검증 - 컴파일 타임 시 에러 발생으로 인해 디버깅 용이
- 보통 엔티티에 @NamedQuery보단 @Query가 사용하기 더 편하고 좋다.
// 엔티티 클래스에 정의
@Entity
@NamedQuery(
name = "Member.findByUsername",
query = "select m from Member m where m.username = :username")
public class Member {
...
}
// 사용
List<Member> resultList =
em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", "회원1")
.getResultList();
// 이름 없는 Named Query
public interface MemberRepository extends JPARepository<Member, Long> {
@Query("select m from Member m where m.address = ?1")
Member findByAddress(String address);
}
💡 Parameter Binding
왠만하면 이름으로 바인딩하자.
위치 기준으로 바인딩 시 위치가 바뀌면 꼬일 수 있다.
이름 기준
Member result = em.createQuery(
"select m from Member m where m.username = :username", Member.class)
.setParameter("username", "member1")
.getSingleResult();
- SELECT m FROM Member m where m.username=:username
위치 기준
Member result = em.createQuery(
"select m from Member m where m.username = ?1", Member.class)
.setParameter(1, "member1")
.getSingleResult();
- SELECT m FROM Member m where m.username=?1