[SpringBoot] Repository 검색 조건 종류 및 작성방법

2023. 12. 31. 12:59SpringBoot+JPA

반응형

 

[SpringBoot 구조] Repository 설명 및 정의 / 어노테이션

[SpringBoot 구조] Entity 설명 및 정의 / 어노테이션 더보기 [목차] - Entity 정의 - Entity 구조 - Entity에 사용되는 어노테이션 종류 Entity 정의 자바 어플리케이션에서 관계형 데이터베이스의 데이터를 객

dalhyehye.tistory.com

 


 

Repository 

검색어를 받아서 서비스에서 처리 후,결과를 페이지에 전달

 

1) Repository에 필요한 메소드를 생성

2) Service에서 해당 Repository를 수행 할 메소드 생성

3) Controller에서 Service의 메소드를 지정

 

기본 제공 : save, delete, findAll, findById, count

findBy~ : 1개의 결과물 조회. 조건에 맞는 모든 결과물 조회

 

오름차순(ASC), 내림차순(DESC)

 


자동으로 %가 붙는 경우

 

모든 결과물을 id기준 내림차순

findAllByOrderByIdDesc

더보기

Repository 선언

 

목록 정렬 처리 (기본키를 이용해서 정렬)

오름차순(ASC), 내림차순(DESC)

findBy~ : 1개의 결과물 조회. 조건에 맞는 모든 결과물 조회

Select * From Board Order By id desc;

List<BoardEntity> findAllByOrderByIdDesc();

모든 결과물을 id기준 내림차순

 

 

Service 선언

전체 목록을 내림차순으로 조회

 

public List<BoardDTO> listOrder() throws Exception {

List<BoardEntity> boardEntityList = boardRepository.findAllByOrderByIdDesc();

List<BoardDTO> boardDTOList = Arrays.asList(modelMapper.map(boardEntityList, BoardDTO[].class));

return boardDTOList;

 }

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listOrder();

model.addAttribute("lists", lists);

return "/board/list"; }

 

 

 

제목을 검색해서 조회

findAllBySubject

더보기

Repository 선언

 

제목을 검색해서 조회

검색할 값을 subject로 받아서 Subject필드에서 동일한 값을 조회

Select * From Board where subject = :subject

List<BoardEntity> findAllBySubject (String subject);

 

 

Service 선언

검색어를 통해서 해당 제목을 조회 (정확히 일치해야 검색 됨)

public List<BoardDTO> listSubjectSearch (String search) throws Exception {

List<BoardEntity> list = boardRepository.findAllBySubject(search);

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result;

}

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listSubjectSearch(search);

model.addAttribute("lists", lists);

return "/board/list";

}

 

 

앞에 문자열이 포함되어 있는(StartsWith 문자열%)

findAllBySubjectStartsWith

더보기

Repository 선언

 

앞에 문자열이 포함되어 있는 제목을 조회

StartsWith는 앞에 문자열이 포함되어 있는 경우 %문자열

Select * From Board where subject = %:subject

List<BoardEntity> findAllBySubjectStartsWith (String subject);

 

 

Service 선언

데이터베이스 명령에서 like는 포함되어 있는 문자열 검색

앞에 문자열이 포함되어 있는 제목을 조회

public List<BoardDTO> listSubjectStart(String search) throws Exception {

List<BoardEntity> list = boardRepository.findAllBySubjectStartsWith(search);

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result;

}

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listSubjectStart(search);

model.addAttribute("lists", lists);

return "/board/list";

}

 

 

 

뒤에 문자열이 포함되어 있는( EndsWith 문자열%)

findAllBySubjectEndsWith

더보기

Repository 선언

 

뒤에 문자열이 포함되어 있는 제목을 조회

EndsWith는 뒤에 문자열이 포함되어 있는 경우 문자열%

Select * From Board where subject = :subject%

List<BoardEntity> findAllBySubjectEndsWith(String subject);

 

 

Service 선언

뒤에 앞에 문자열이 포함되어 있는 제목을 조회

public List<BoardDTO> listSubjectEnd(String search) throws Exception {

List<BoardEntity> list = boardRepository.findAllBySubjectEndsWith(search);

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result;

}

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listSubjectEnd(search);

model.addAttribute("lists", lists);

return "/board/list";

}

 

 

문자열이 포함된 제목을 조회 

findAllBySubjectContains

더보기

Repository 선언

 

문자열이 포함된 제목을 조회

Contains는 문자열이 포함되어 있는 경우 %문자열%

Select * From Board where subject = %:subject%

List<BoardEntity> findAllBySubjectContains(String subject);

 

 

Service 선언

앞뒤에 문자열이 포함되어 있는 제목을 조회

public List<BoardDTO> listSubjectContains(String search) throws Exception {

List<BoardEntity> list = boardRepository.findAllBySubjectContains(search);

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result;

}

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listSubjectContains(search);

model.addAttribute("lists", lists);

return "/board/list";

}

 


 

수동으로 %추가 해줘야 하는 경우

 

문자열의 위치를 수동으로 지정해서 제목을 조회

findAllBySubjectLike

더보기

Repository 선언

 

문자열의 위치를 수동으로 지정해서 제목을 조회

Like는 %을 추가해서 문자열의 위치를 지정 --> %문자열%, %문자열, 문자열%

List<BoardEntity> findAllBySubjectLike(String subject);

 

 

Service 선언

수동으로 문자열이 포함되어 있는 제목을 조회

public List<BoardDTO> listSubjectLike(String search) throws Exception {

List<BoardEntity> list = boardRepository.findAllBySubjectLike("%"+search+"%");

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result; }

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listSubjectLike(search);

model.addAttribute("lists", lists);

return "/board/list";

}

 

 

질의어를 임의로 작성해서 제목을 조회 

findAllBySubjectSql

@Query("SELECT u FROM BoardEntity u WHERE u.subject like :subject")


Query("Select 별칭명 From 테이블명 별칭명 where 별칭명.필드명 = ...)
u(boardentity의 모든 필드) from boardEntity u(앞으로 boardEntity를 u로 호칭)
u.subject(boardentity의 subject 필드) : subject(받은 변수명)
더보기

Repository 선언

 

질의어를 임의로 작성해서 제목을 조회

대문자는 문법

 

@Query("SELECT u FROM BoardEntity u WHERE u.subject like :subject")

List<BoardEntity> findAllBySubjectSql(String subject);

 

 

Service 선언

Query를 이용한 제목을 조회

 

public List<BoardDTO> listSubjectSql(String search) throws Exception {

List<BoardEntity> list = boardRepository.findAllBySubjectSql("%"+search+"%");

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result; }

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listSubjectSql(search);

model.addAttribute("lists", lists);

return "/board/list";

}

 

 

필드명과 전달받은 변수명이 다른 경우 

findAllBySubjectSqlNo

@Query("SELECT u FROM BoardEntity u WHERE u.subject like :subject")
더보기

Repository 선언

 

필드명과 전달받은 변수명이 다른 경우

@Param("subject") String name : name을 subject변수로 사용

 

@Query("SELECT u FROM BoardEntity u WHERE u.subject like :subject")

List<BoardEntity> findAllBySubjectSqlNo(@Param("subject") String name);

 

 

Service 선언

서로 다른 변수를 연결하여 제목을 조회

public List<BoardDTO> listSubjectSqlNo(String search) throws Exception {

List<BoardEntity> list = boardRepository.findAllBySubjectSqlNo("%"+search+"%");

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result; }

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listSubjectSqlNo(search);

model.addAttribute("lists", lists);

return "/board/list";

}

 

 

2개의 필드를 이용해서 조회 (제목과 작성자)  

findAllByField

@Query("SELECT u FROM BoardEntity u WHERE u.subject like :subject OR u.writer like:writer")
더보기

Repository 선언

 

2개의 필드를 이용해서 조회 (제목과 작성자)

JPA에서 Query를 이용할 때는 메소드 규칙은 필요 없음

 

@Query("SELECT u FROM BoardEntity u WHERE u.subject like :subject OR u.writer like:writer")

List<BoardEntity> findAllByField(String subject, String writer);

 

 

Service 선언

2개 이상의 필드로 조회

public List<BoardDTO> listManyField(String search) throws Exception {

List<BoardEntity> list = boardRepository.findAllByField("%"+search+"%", "%"+search+"%");

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result; }

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listManyField(search);

model.addAttribute("lists", lists);

return "/board/list";

}

 

 

번호 10보다 작은 자료만 조회   

findAllByIdLessThan

이하(LessThan)Equal / 미만(LessThan)

더보기

Repository 선언

 

번호 10보다 작은 자료만 조회

 

List<BoardEntity> findAllByIdLessThan(int id);

 

 

Service 선언

아이디가 10보다 작은 게시물 조회

 

public List<BoardDTO> listLessThan(int id) throws Exception {

List<BoardEntity> list = boardRepository.findAllByIdLessThan(id);

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result;

}

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

List<BoardDTO> lists = boardService.listLessThan(10);

model.addAttribute("lists", lists);

return "/board/list";

}

 

 

조회수가 20 이상 자료만 조회   

findAllByIViewcountGreaterThanEqual

이상(GreaterThanEqual) / 초과(GreaterThan)

더보기

Repository 선언

 

조회수가 20이상인 자료만 조회

 

List<BoardEntity> findAllByViewcountGreaterThanEqual(int viewcount);

 

 

Service 선언

조회수가 20이상인 자료만 조회

public List<BoardDTO> listGreaterThanEqual(int viewcount) throws Exception {

List<BoardEntity> list = boardRepository.findAllByViewcountGreaterThanEqual(viewcount);

List<BoardDTO> result = Arrays.asList(modelMapper.map(list, BoardDTO[].class));

return result;

}

 

 

Controller 선언

@PostMapping("/selectlist")

public String selectProc(String search, Model model) throws Exception {

 List<BoardDTO> lists = boardService.listGreaterThanEqual(70);

model.addAttribute("lists", lists);

return "/board/list";

}

 

 


📌 참고 사이트

 

JPA Query Methods :: Spring Data JPA

By default, Spring Data JPA uses position-based parameter binding, as described in all the preceding examples. This makes query methods a little error-prone when refactoring regarding the parameter position. To solve this issue, you can use @Param annotati

docs.spring.io

 

 

반응형