Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- cheerio
- SpringRESTDocs
- cloud native
- openapi3
- gradle
- Flyway
- stopPropogation
- AuthenticatoinProvide
- vuejs
- JavaScript
- MFA
- OpenStack
- Crawling
- tasklet
- Spring Security
- MSA
- T-OTP
- 리액트
- Pender
- Reduxpender
- Spring REST Docs
- preventdefault
- SpringBoot
- Filter
- REACT
- vue
- SWAGGER
- axios
- Spring Batch
- UsernamePasswordAuthenticationFilter
Archives
- Today
- Total
Miracle Morning, LHWN
4. 객체지향 쿼리언어_1 본문
객체지향 쿼리언어
복잡한 검색 조건을 사용하여 엔티티 객체를 조회할 수 있는 다양한 쿼리기술이다.
- JPQL : Java Persistence Query Language
- Criteria 쿼리 : JPQL 을 편하게 작성하도록 도와주는 API 혹은 빌더 클래스 모음
- 네이티브 SQL : JPA 에서 JPQL 대신 쿼리를 직접 사용할 수 있다.
- QueryDSL : 쿼리처럼 JPQL 을 편하게 작성하도록 도와주는 빌더 클래스이며, 비표준 오픈소스 프레임워크이다.
- 그 외 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());
}
'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