[java] JPQL & Paging & @Query

๊ณต๋ถ€๊ธฐ๋กยท2023๋…„ 11์›” 23์ผ
0
post-thumbnail

๐Ÿ“‚ JPQL

JPA Query Language๋กœ JPA์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค. SQL๊ณผ JPQL์˜ ์ฐจ์ด๋Š” SQL์€ ํ…Œ์ด๋ธ”์ด๋‚˜ ์นผ๋Ÿผ์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ JPQL์€ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ์˜ ์ด๋ฆ„๊ณผ ํ•„๋“œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค.


์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ

์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์ œ(Subject)์™€ ์„œ์ˆ ์–ด(Predicate)๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. 'find domain By' ํ˜น์€ 'exists domain By'์™€ ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜๊ณ  By๋‹ค์Œ์€ ์นผ๋Ÿผ๋ช…์ด ๋“ค์–ด๊ฐ„๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ๋Š” And๋กœ ์—ฐ๊ฒฐ.

// (return type) + (์ฃผ์ œ + ์„œ์ˆ ์–ด(์†์„ฑ)) ๊ตฌ์กฐ์˜ ๋ฉ”์„œ๋“œ
List<Person> findByLasnameAndEmail(String lastName, String email);

```java SELECT p FROM Product p WHERE p.number = ?1; ``` ## find ... By Collection์ด๋‚˜ Stream์— ์†ํ•œ ํ•˜์œ„ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ ```java Optional findByNumber(Long number); List findByName(String name); ```

exists ... By

ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ boolean์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

boolean extistByNumber(Long number);

count ... By

์กฐํšŒ ํ›„ ๊ฒฐ๊ณผ์˜ ๋ ˆ์ฝ”๋“œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

long countByName(String name);

(Is)Null, (Is)NotNull

๊ฐ’์ด null์ธ์ง€ ๊ฒ€์‚ฌ

List<Product> findByUpdatedAtNull();
List<Product> findByUpdatedAtNotNull();

(Is)True, (Is)False

boolean ํƒ€์ž…์œผ๋กœ ์ง€์ •๋œ ์นผ๋Ÿผ์„ ํ™•์ธ

Product findByActiveTrue();
Product findByActiveFalse();



๐Ÿ“ƒ ์ •๋ ฌ

ORDER BY ๊ตฌ๋ฌธ์ด์šฉํ•˜์—ฌ ์ •๋ ฌ

List<Product> findByNameOrderByNumberAsc(String name);

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ

List<Product> findByName(String name, Sort sort);

productRepository.findByName("pen", Sort.by(Order.asc("price");



๐Ÿ“‘ ํŽ˜์ด์ง•์ฒ˜๋ฆฌ (Paging)

Page<Product> findByName(String name, Pageable pageable);

//ํŽœ์ด๋ž€ name์„ ๊ฐ€์ง„ Prodcut ์ค‘ ํŽ˜์ด์ง€๋‹น 2๊ฐœ์”ฉ ๊ฐ์ฒด ์ถœ๋ ฅ
Page<Product> productPage = productRepository.findByName("ํŽœ", PageRequest.of(0,2);

๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ๋Š” Page ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์•ผํ•˜๊ณ  Pageable ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด PageRequest class๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
PageRequest๋Š” Pageable์˜ ๊ตฌํ˜„์ฒด์ด๋‹ค.

|of ๋ฉ”์„œ๋“œ|๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค๋ช…|๋น„๊ณ |
|of(int page, int size)|ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ(0๋ถ€ํ„ฐ ์‹œ์ž‘), ํŽ˜์ด์ง€๋‹น ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜|์ •๋ ฌx|
|of(int page, int size, Sort|ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ, ํŽ˜์ด์ง€๋‹น ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜, ์ •๋ ฌ|sort์— ์˜ํ•ด ์ •๋ ฌ|



@Query

@Query๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง์ ‘ JPQL์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

//ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
@Query("SELECT p FROM Product p WHERE p.name = :name")
List<Product> findByNameParam(@Param("name" String name);

@Query("SELECT p.name, p.price, p.stock FROM Product p WHERE p.name = :name")
LisT<Object[]> findByNameParam2(@Param("name") String name);

์ถœ์ฒ˜ : ์Šคํ”„๋ง๋ถ€ํŠธ ํ•ต์‹ฌ ๊ฐ€์ด๋“œ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด