Miracle Morning, LHWN

4. 객체지향 쿼리언어_1 본문

IT 기술/[JAVA] Spring Boot

4. 객체지향 쿼리언어_1

Lee Hye Won 2021. 5. 6. 05:32

객체지향 쿼리언어

복잡한 검색 조건을 사용하여 엔티티 객체를 조회할 수 있는 다양한 쿼리기술이다.

 

  1. JPQL : Java Persistence Query Language
  2. Criteria 쿼리 : JPQL 을 편하게 작성하도록 도와주는 API 혹은 빌더 클래스 모음
  3. 네이티브 SQL : JPA 에서 JPQL 대신 쿼리를 직접 사용할 수 있다.
  4. QueryDSL : 쿼리처럼 JPQL 을 편하게 작성하도록 도와주는 빌더 클래스이며, 비표준 오픈소스 프레임워크이다.
  5. 그 외 JDBC, MyBatis 와 같은 SQL 매퍼 프레임워크

# JPQL 

엔티티 객체를 조회하는 객체 지향 쿼리이다.

문법은 SQL 과 유사하지만 좀 더 간결하며, SQL 을 추상화하기 때문에 특정 DB 에 의존하지 않는다.

String jpql = "select user from User as user where user.name = `kim`";
List<User> userList = em.createQuery(jpql, User.class).getResultList()

위 코드에서 user.name 은 컬럼명이 아니라 엔티티 객체의 필드명이다.

 

  • 엔티티와 속성은 대소문자를 구분한다. JPQL 키워드는 대소문자를 구분하지 않는다.
  • 테이블명, 클래스명이 아닌 엔티티명을 사용한다.
  • 별칭이 필수이다.
  • SELECT NEW
  • TypeQuery : 반환할 타입을 명확하게 지정할 수 있는 경우
  • Query : 반환할 타입을 명확하게 지정할 수 없는 경우, Object 를 반환한다.
  • 파라미터 바인딩 - 이름 기준 바인딩 : ":" 를 사용 (✅ 권장)
  • 파라미터 바인딩 - 위치 기준 바인딩 : ?n 을 사용
 // TypeQuery
 TypedQuery<User> query = em.createQuery("SELECT user From USER user", User.class);
 List<User> userList = query.getResultList();
 for(User user : userList) {
   log.info("User Name: " + user.getName());
 }
// Query
Query query = em.createQuery("SELECT user.name, user.id, from User user");
List resultList = query.getResultList();
for(Object o : resultList) {
	Object[] result = (Object[]) o;
    log.info("UserName: " + result[0] + ", user id: " + result[1]);
}

 

// 파라미터 바인딩 - 위치 기준 파라미터 바인딩
String param = "Alice";
TypedQuery<User> query = 
	em.createQuery("SELECT user from User ad user where user.name = ?1", User.class);
    
query.setParameter(1, param);
List<User> userList = query.getResultList();
// 파라미터 바인딩 - 이름 기준 파라미터 바인딩
String param = "Alice";
TypeQuery<User> query = 
	em.createQuery("SELECT user from User as user where user.name = :param", User.class);
query.setParameter("param", param);
List<User> userList = query.getResultList();

List<User> userList = em.createQuery(
	"SELECT user from User as user where user.name = :param", User.class)
    .setParameter("param", param)
    .getResultList();

 

  • 페이징 처리

     - setFirstResult(itn startPosition) : 조회 시작 위치 (0부터 시작)

     - setMaxResults(int maxresult) : 조회할 데이터 수

TypedQuery <User> query = 
	em.createQuery("SELECT user from User as user Order by user.id asc", User.class);
query.setFirstResult(0);
query.setMaxResults(2);
List<User> userList = query.getResultList();

 

  • 프로젝션 : SELECT 절에서 조회할 대상을 지정하는 것

    - 엔티티 프로젝션

    - New 를 이용한 프로젝션 : 필요한 데이터만 선택적으로 조회하는 경우 사용

String jpql = 
	"select new com.jpapeeknapply.service.UserDto(user.id, user.name)" + 
    "from User as user" +
    "where user.name = 'alice'";
    
List<UserDto> resultList = em.createQuery(jpql, UserDto.class).getResultList();
for(UserDto userDto  resultList) {
	log.info(userDto.toString());
}

 

 

출처 : fastcampus.co.kr/courses/204729/clips/

'IT 기술 > [JAVA] Spring Boot' 카테고리의 다른 글

6. Spring Data JPA  (0) 2021.05.06
5. 객체지향 쿼리언어_2  (0) 2021.05.06
3. 프록시와 연관관계  (0) 2021.05.05
2. 연관관계매핑  (0) 2021.05.05
1. 엔티티 (Entity) 와 엔티티 매니저 (Entity Manager)  (0) 2021.05.05
Comments