@Query
๐ค์์ ๋ฐฐ์ ๋ ๋ด์ฉ๋ง ํ์ฉํ ์์์ผ๋ฉด JPA๋ ์ธ์ ์๋ค. ํ์ง๋ง ์ฝ๊ฐ์ ์์ธ์ ์ธ ์ํฉ์์ Customํด์ผํ๋ ์ํฉ์ด ์๊ธด๋ค. ๊ทธ๋ด๋๋ @Query๋ฅผ ์จ๋ณด์.
์? @Query๐ค๐ค
์ฒซ๋ฒ์งธ ์ด์ ๋ก ๊ธด Query Method์ ๊ฐ๋ ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ค๋ค. (JPQL ์ฌ์ฉ)
Query Method์ ์ด๋ฆ์ ๊ธธ์ด ๊ต์ฅํ ๊ธธ์ด์ง๋ ์ฌ์ฉํ๋ฉด ์ข๋ค. ์์ฒญ ๊ธด ์ด๋ฆ์ ์ฟผ๋ฆฌ๋ฅผ ํ๋ฒ ๋ง๋ค์ด๋ณด๊ณ Test ํด๋ณด์.
// ์นดํ ๊ณ ๋ฆฌ๊ฐ null์ด๋ฉด์ ์ด๋ฆ์ ์ง์ ํ๊ฐ์ผ๋ก,createdAt ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , updatedAt ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์ฟผ๋ฆฌ List<Book> findByCategoryIsNullAndNameEqualsAndCreatedAtGreaterThanEqualAndUpdatedAtGreaterThanEqual(String name, LocalDateTime createdAt,LocalDateTime updatedAt);
@Test void queryTest() { bookRepository.findAll().forEach(System.out::println); System.out.println("findByCategoryIsNullAndNameEqualsAndCreatedAtGreaterThanEqualAndUpdatedAtGreaterThanEqual : " + bookRepository.findByCategoryIsNullAndNameEqualsAndCreatedAtGreaterThanEqualAndUpdatedAtGreaterThanEqual( "JPA ์์๊ฒฉ์ฐจ ํด๋์ค", LocalDateTime.now().minusDays(1L), LocalDateTime.now().minusDays(1L) ));
data.sql์์ ๋์ํ๋ ์ฟผ๋ฆฌ๋ ๋ฆฌ์ค๋์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
insert into publisher(`id`,`name`,`created_At`,`updated_At`) value (1, '๋น ๋ฅธ๋ํ',now(),now()); insert into book(`id`,`name`,`publisher_id`, `deleted`, `created_At`,`updated_At`) values (2,'Spring Security ์์๊ฒฉ์ฐจ ํด๋์ค', 1,false,now(),now()); insert into book(`id`,`name`,`publisher_id`, `deleted`, `created_At`,`updated_At`) values (3,'SpringBoot ํ๋์ธ ํด๋์ค', 1,true,now(),now()); insert into book(`id`,`name`,`publisher_id`, `deleted`, `created_At`,`updated_At`) values (1,'JPA ์์๊ฒฉ์ฐจ ํด๋์ค', 1,false,now(),now());
์์๊ฐ์ด ์ฟผ๋ฆฌ๋ฌธ์ ์ผ์ผ์ด ์ถ๊ฐํด์ค๋ ๋์ง๋ง JPA๋ฅผ ์ด์ฉํด๋ณด์.
@EntityListeners(value = AuditingEntityListener.class) public class BaseEntity implements Auditable { @CreatedDate @Column(columnDefinition = "datetime(6) default now(6) comment '์์ฑ์๊ฐ'", nullable = false, updatable = false) private LocalDateTime createdAt; @LastModifiedDate @Column(columnDefinition = "datetime(6) default now(6) comment '์์ ์๊ฐ'", nullable = false) private LocalDateTime updatedAt; }
columnDefinition์ ์ด์ฉํด์ Auto DDL์ ์์ฑํ๋๊ฑด ํ์ ์์ ์ ์ฐ์ด์ง๋ ์์ง๋ง ์์๋์.
์์๊ฐ์ด columnDefinition์ ์ฃผ๋ฉด DDL ์์ฑ์ ํ ๋ ์๋์ ๊ฐ์ด ์์ฑ๋๋ค.
create table author ( id bigint not null auto_increment, created_at datetime(6) default now(6) comment '์์ฑ์๊ฐ' not null, updated_at datetime(6) default now(6) comment '์์ ์๊ฐ' not null,
์ํฐํฐ๋ฅผ ์์๊ฐ์ด ๊ณ ์น๊ณ Testํ๋ฉด ์ ๋์ฌ ๊ฒ์ด๋ค.
์, ๊ธธ๊ณ ๊ธด method ์ด๋ป๊ฒ ๊ณ ์น๋? ๋ฐ๋ก @Query๋ฅผ ์ด์ฉํ์.
@Query(value = "select b from Book b where name = ?1 and createdAt >= ?2 and updatedAt >= ?3 and category is null") List<Book> findByNameRecently(String name, LocalDateTime createdAt,LocalDateTime updatedAt);
@Test void queryTest() { System.out.println("findByNameRecently : " + bookRepository.findByNameRecently( "JPA ์์๊ฒฉ์ฐจ ํด๋์ค", LocalDateTime.now().minusDays(1L), LocalDateTime.now().minusDays(1L)));
์์์ ์ฌ์ฉ๋ ์ฟผ๋ฆฌ๊ฐ JPQL์ ์ฌ์ฉํ๊ฒ ๋๋ค.
JPQL์ ์ฅ์ ์ ๋ค์ด์ผ๋ ํธ(๋ฐฉ์ธ)๊ธฐ๋ฅ๋๋ฌธ์ DB์ ๋ง๊ฒ Query๋ฅผ ์์ฑํด์ค๋ค. ๊ทธ๋์ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ์ ์ฐจ์ด๊ฐ ์๋ค. ๋ํ ํด๋์ค์์ ์ฌ์ฉํ @Where ๋ ์ ์ฉ๋๋ค. ?1,?2,?3์ ๊ฐ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ปํ๋ค. ํ์ง๋ง ์๋ฐ์์๋ ์์์ ์์กดํ๋ ํ๋ผ๋ฏธํฐ์ ์ฌ์ฉ์ ์ง์ํ๋ค. ๋ฐ๋ผ์ @Param์ ์ฌ์ฉํ๋ค.
@Query(value = "select b from Book b where name = :name and createdAt >= :createdAt and updatedAt >= :updatedAt and category is null") List<Book> findByNameRecently( @Param("name") String name, @Param("createdAt") LocalDateTime createdAt, @Param("updatedAt") LocalDateTime updatedAt);
๋๋ฒ์งธ ์ด์ ๋ก Entity์ ์ฐ๊ฒฐ๋์ง์๋ ์ฟผ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์ค์ ํ์ ์์ ์ฌ์ฉํ๋ Entity์ ์ปฌ๋ผ์ ์ ๋ง ๋ง๋ค. ๊ทธ๋ด๋ ํ์ํ ์ปฌ๋ผ๋ง ์ถ๋ ค์ ์กฐํํ ์ ์๋ค.
- ์ค์ต์ ํด๋ณด์. ๋จผ์ dtoํจํค์ง๋ฅผ ๋ง๋ค๊ณ BookNameAndCategory ํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ์.
@Data @AllArgsConstructor @NoArgsConstructor public class BookNameAndCategory { private String name; private String category; }
- ์ด๋ ๊ฒ ํ๋ฉด ๊ตฌ์ฒดํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ Query๋ฅผ ๋ฐ์์ฌ์ ์๋ค.
@Query(value = "select new com.practice.jpa.bookmanager.repository.dto.BookNameAndCategory(b.name, b.category) from Book b") List<BookNameAndCategory> findBookNameAndCategory();
- ์ด๋ ๊ฒ DTO ๊ตฌ์ฒดํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ ์ปฌ๋ผ๋ง ์ฌ์ฉํ์ฌ @Query๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
@Query๋ฅผ ์ด์ฉํ Paging
@Query(value = "select new com.practice.jpa.bookmanager.repository.dto.BookNameAndCategory(b.name, b.category) from Book b")
Page<BookNameAndCategory> findBookNameAndCategory(Pageable pageable);
test
bookRepository.findBookNameAndCategory(PageRequest.of(1, 1)).forEach(
bookNameAndCategory -> System.out.println(bookNameAndCategory.getName() + " : " + bookNameAndCategory.getCategory()));
bookRepository.findBookNameAndCategory(PageRequest.of(0, 1)).forEach(
bookNameAndCategory -> System.out.println(bookNameAndCategory.getName() + " : " + bookNameAndCategory.getCategory()));
'Dev > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA Converter (0) | 2022.03.02 |
---|---|
JPA Native Query (0) | 2022.03.02 |
JPA OrphanRemoval(+@Where) (0) | 2022.03.02 |
JPA์์ Transaction ํ์ฉํ๊ธฐ (0) | 2022.03.02 |
JPA Cascade (0) | 2022.03.02 |