인프런 커뮤니티 질문&답변

gayoung78님의 프로필 이미지

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

JPA에서 findById, findByName에서 궁금한게있습니다.

작성

·

1.1K

0

package hello.hellospring.repository; import hello.hellospring.domain.Member; import javax.persistence.EntityManager; import java.util.List; import java.util.Optional; public class JpaMemberRepository implements MemberRepository { private final EntityManager em; // build.gradle에서 data-jpa를 등록함 // 스프링부트가 자동으로 EntityManager 만들어줌 public JpaMemberRepository(EntityManager em) { this.em = em; } // 저장, 조회, 업데이트는 쿼리 짤 필요 없음 @Override public Member save(Member member) { em.persist(member); // persist=영구저장-> setId등 모든것을 해줌 return member; } @Override public Optional findById(Long id) { Member member = em.find(Member.class, id); return Optional.ofNullable(member); } // 리스트로 탐색 시 @Override public Optional findByName(String name) { List result = em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name", name) .getResultList(); return result.stream().findAny(); } @Override public List findAll() { // 객체를 대상으로 쿼리를 날림 -> entity 자체를 select하는 것임 List result = em.createQuery("select m from Member m", Member.class) .getResultList(); return result; // return em.createQuery("select m from Member m", Member.class) // .getResultList(); } }

 

여기에서 findById는 sql없이 찾을 수 있는데 findByName은 쿼리를 작성해주는데, 이유가 어떤건가요?

혹시 id의 경우 제가 db에 넣는게아니라 컴퓨터에서 직접 넣어주는거고 name은 제가 입력해서 db에 넣기 때문인가요?

그리고 findByName에서 sql을 이용해서 특정 데이터를 뽑아내면 list로 나오는데, findById의 경우는 리스트로 나오는게 아닌가요,,?

답변 1

1

entity의 @id로 매칭시킨 필드가 검색되는 것이지요.

당연히 결과도 리스트로 받으실 수 있습니다.

 

findByName 의경우 메서드 명명규칙에 따라 작성해주셔야 합니다.

entity에 String name 이런식으로 작성이 되있으시겠죠.

롬보을 쓰실경우

getName 이 작성 된다 했을때 저 Name부분을 findBy뒤에 쓰시면 사용가능합니다.

결과는 물론 list일수도 있구요.

 

도움이 되었으면 좋겠네요.