몬그로이

JPQL - 복잡한 쿼리를 수동으로 작성하고 실행하는 방법 본문

Organizing Docs/Java Docs

JPQL - 복잡한 쿼리를 수동으로 작성하고 실행하는 방법

Mon Groy 2024. 6. 30. 20:00
  • 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);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Organizing Docs > Java Docs' 카테고리의 다른 글

Coding 01  (0) 2024.07.04
SubQuery, JPAExpressions  (0) 2024.07.01
ORM  (0) 2024.06.28
Spring Data JPA  (0) 2024.06.28
페이징  (0) 2024.06.28