Developer Cafe

@Query를 사용한 예시 본문

Spring/JPA

@Query를 사용한 예시

개발자 카페 2021. 7. 6. 11:29
728x90

1. 제목에 대한 검색 처리

title에 특정 문자열이 들어간 게시물을 검색하고싶다면...

public interface BoardRepository extends CrudRepository<Board, Long> {
	
    @Query("SELECT b FROM Board b WHERE b.title LIKE %?1% AND b.bno > 0 ORDER BY b.bno DESC")
    public List<Board> findByTitle(String title);
}

* %?1% 에서 '?1'은 첫 번째로 전달되는 파라미터라고 생각하면 됩니다.

@Autowired
private BoardRepository repo;

@Test
public void testByTitle2() {
	
	repo.findByTitle("17").forEach(board -> System.out.println(board));   
    
}

결과는 게시물 번호(bno)의 역순으로 처리된 것을 확인할 수 있습니다.

2. 내용에 대한 검색 처리

public interface BoardRepository extends CrudRepository<Board, Long> {
	
    @Query("SELECT b FROM Board b WHERE b.content LIKE %:content% AND b.bno > 0 ORDER BY b.bno DESC")
    public List<Board> findByContent(@Param("content") String content);
}

3. 작성자에 대한 검색 처리

public interface BoardRepository extends CrudRepository<Board, Long> {
	
    @Query("SELECT b FROM #{#entityName} b WHERE b.writer LIKE %?1% AND b.bno > 0 ORDER BY b.bno DESC")
    public List<Board> findByWriter(String writer);
}

#{#entityName}은 Repository 인터페이스를 정의할 때 <엔티티 타입, PK 타입>에서 엔티티 타입을 자동으로 참고합니다. 지금은 그다지 쓸모가 없지만, 유사한 상속 구조의 Repository 인터페이스를 여러 개 생성하는 경우라면 유용하게 사용할 수 있습니다.

 

4. 필요한 칼럼만 추출하는 경우

예를 들어 content 칼럼의 내용을 제외한 칼럼을 가져오고싶다면...

public interface BoardRepository extends CrudRepository<Board, Long> {
	
    @Query("SELECT b.bno, b.title, b.writer, b.regdate" + " FROM Board b WHERE b.title LIKE %?1% AND b.bno > 0 ORDER BY b.bno DESC")
    public List<Object[]> findByTitle2(String title);
}

5. nativeQuery

@Query는 말 그대로 데이터베이스에 종속적인 SQL문을 그대로 사용할 수 있기 때문에 복잡한 쿼리를 작성할 때에는 유용하게 사용할 수 있습니다. 다만, 이 경우 데이터베이스에 독립적이라는 장점을 어느 정도 포기해야 하므로 남용하지 않도록 주의해야 합니다.

@Query에 nativeQuery 속성을 'true'라고 지정하면 메소드 실행 시 @Query의 value 값을 그대로 실행하게 됩니다.

public interface BoardRepository extends CrudRepository<Board, Long> {
	
    @Query(value="SELECT bno, title, writer FROM tbl_boards WHERE title LIKE CONCAT('%', ?1, '%') and bno > 0 order by bno DESC", nativeQuery=true)
    List<Object[]> findByTitle3(String title);
}

6. @Query와 Paging 처리/정렬

public interface BoardRepository extends CrudRepository<Board, Long> {
	
    @Query("SELECT b FROM Board b WHERE b.bno > 0 ORDER BY b.bno DESC")
    public List<Board> findBypage(Pageable pageable);
}

테스트...

@Autowired
private BoardRepository repo;

@Test
public void testByPaging() {
	
    Pageable pageable = new PageRequest(0, 10);
	repo.findBypage(pageable).forEach(board -> System.out.println(board));   
    
}
728x90
Comments