JPQL
JPQL이란?
JPA에서 사용할 수 있는 쿼리를 말한다.
- String으로 쿼리문을 작성, EntityManager을 통해 쿼리 실행한다.
1 2 3 4
String jpql = "select product " + "from Product product " + "where product.name = '펜' " + "order by product.price asc, product.stock desc";
- SQL은 데이터베이스 테이블을 대상으로 쿼리하는데 반해, JPQL은 엔티티 객체를 대상으로 쿼리를 실행한다.
EntityManager란?
EntityManager란, 엔티티를 저장하고, 수정하고, 삭제하고 조회하는 등 엔티티와 관련된 모든 일을 처리하는 Bean.
- 스프링부트는 EntityManager가 자동으로 등록되어있어서, 아래와 같이 간단하게 불러올 수 있.
1 2
@PersistenceContext private EntityManager em;
- 작성한 JPQL 문자열을 다음과 같이 메소드를 호출해 쿼리를 실행할 수 있다.
1
List<Product> jpqlResult = em.createQuery(jpql, Product.class).getResultList();
JpaRepository의 쿼리 메서드
리포지토리는 JPA Repository를 상속 받는 것만으로 기본적인 CRUD 메서드를 제공하지만, 이런 메서드들은 PK 기반으로 생성되기 때문에, 다른 조건으로 쿼리하려면 별도의 메서드를 정의해서 사용해야 한다. 이 때 간단한 쿼리문을 작성하기 위해 사용되는 것이 쿼리 메서드이다.
쿼리 메서드는 다음과 같은 키워드들을 조합해 생성할 수 있다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public interface ProductRepository extends JpaRepository<Product, Long> {
// ----- 주제 키워드 -----
// 무엇을 찾을 지 정함. 반환 타입이 달라짐.
/*
조회
find / read / get / query / search / stream
*/
List<Product> findByName(String name, Sort sort);
/*
개수 제한 (단건 조회 가능)
First<number> / Top<number>
*/
List<Product> findFirst5ByName(String name, Sort sort);
Product findFirstProduct(String name); // Sort를 createdAt 기준으로 주면, 가장 최근에 생성된 데이터 조회 가능.
/*
존재 유무
exists
*/
boolean existsProductByPrice(Integer price);
/*
개수
count
*/
Integer countProductByStock(Integer stock);
/*
삭제 (삭제된 갯수 반환 가능)
delete / remove
*/
void deleteProductByName(String name);
// ----- 조건자 키워드 -----
// 모든 조건자 앞에 Is를 넣을 수도 있다.
/*
일치
(생략) / Equals
*/
List<Product> findByProductId(Long productId, Sort sort);
/*
불일치
Not
*/
List<Product> findProductByProductIdNot(Long productId, Sort sort);
/*
일부 일치
StartingWith / EndingWith / Containing / Like
*/
List<Product> findProductByNameStartingWith(String name, Sort sort);
/*
null 확인
Null / NotNull
*/
List<Product> findProductByNameNull(String name, Sort sort);
/*
boolean 확인
True / False
*/
// List<Product> find___ByTrue(String name, Sort sort); // boolean 컬럼이 없기 때문에 주석처리
/*
대소 비교
GreaterThan / LessThan / Between
뒤 Equal 추가로 경곗값 포함 가능
*/
List<Product> findProductByPriceGreaterThan(Integer price);
/*
전후 비교 (시간)
After / Before
*/
List<Product> findByCreatedAtBefore(LocalDateTime time);
}