JPQL - 복잡한 쿼리를 수동으로 작성하고 실행하는 방법
- SQL : Table 명으로 쿼리짤때 쓰이는 언어 (쓰이는곳. JDBC, SQL Mapper)
- JPQL : Entity 명으로 쿼리짤때 쓰이는 언어 (쓰이는곳. JPQL, QueryDSL)
JPQL (Java Persistence Query Language)
Table 이 아닌 Entity(객체) 기준으로 작성하는 쿼리
EntityManger 또는 @Query 구현체를 통해 JPQL 쿼리를 사용할 수 있다.
EntityMananger.createQuery()
- 쿼리 문자열과 Entity 를 직접 넣어서 쿼리를 작성한다.
- setParameter 와 같이 key, value 문자열을 통해서 쿼리 파라미터를 매핑할 수 있다.
@Test
public void testEmCreateQuery() {
String qlString = "select u from User u " +
"where u.username = :username";
Member findUser = em.createQuery(qlString, User.class) //위에 작성해둔 쿼리 문자열과 Entity를 넣음
.setParameter("username", "teasun")
.getSingleResult();
assertThat(findUser.getUsername()).isEqualTo("teasun");
}
@Query (repository interface)
- @Query 의 인자값으로 간단하게 쿼리를 작성할 수 있습니다.
쿼리를 작성할때는 테이블명이 아니라 Entity 명으로 조회하게 됩니다.
→ 오타나 잘못된 변수명이 확인됨 - 변수 바인딩은 2가지 방법으로 할 수 있습니다.
방법1. 변수 순번 사용
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u, u.password AS customField FROM User u WHERE u.username = ?1")
List<User> findByUsernameWithCustomField(String username, Sort sort);
@Query("SELECT u FROM User u WHERE u.username = ?1")
List<User> findByUsername(String username, Sort sort);
}
방법2. 변수명 사용
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u, u.password AS customField FROM User u WHERE u.username = :username")
List<User> findByUsernameWithCustomField(String username, Sort sort);
@Query("SELECT u FROM User u WHERE u.username = :username")
List<User> findByUsername(String username, Sort sort);
}