name 필드를 기준으로 Item 객체를 찾을때, 엔티티 매니저의 find 함수를 사용할 수는 없는거야?
맞습니다! 엔티티 매니저의 find 함수를 사용하여 주어진 키 값에 해당하는 엔티티를 찾을 수 있습니다. 그러나 find 함수는 주로 기본 키(primary key)를 기반으로 엔티티를 찾는 데 사용됩니다. 주로 엔티티의 기본 키 값을 알고 있는 경우에 사용하며, 기본 키를 이용하여 빠르게 엔티티를 검색할 수 있습니다.
하지만 여기서 필요한 것은 name 필드를 기준으로 Item 객체를 찾는 것이며, 기본 키와는 관련이 없는 검색입니다. 따라서 find 함수를 사용하는 것은 적절하지 않습니다. 대신에 엔티티 매니저의 createQuery 메서드를 사용하여 JPQL(Java Persistence Query Language)을 작성하여 원하는 검색을 수행해야 합니다. 이렇게 함으로써 특정 필드를 기준으로 엔티티를 검색할 수 있습니다.
앞서 제시한 코드에서 findByName 메서드는 createQuery 메서드를 사용하여 name 필드를 기준으로 검색하고 있습니다. 이렇게 하면 name 필드에 해당하는 Item 객체를 찾을 수 있습니다.
예시)
@Repository
@RequiredArgsConstructor
public class ItemRepository {
private final EntityManager em;
public void save(Item item) {
if(item.getId() == null) {//저장되기 전까지 id값이 없으므로(완전히 새로 생성된 객체이므로) => 신규로 등록
em.persist(item);
}else{//기존에 db에 등록되어 있음 => 강제로 업데이트
em.merge(item);
}
}
public Item findOne(Long id) {
return em.find(Item.class, id);
}
public List<Item> findAll() {
return em.createQuery("select i from Item i", Item.class)
.getResultList();
}
}
위 코드에서 Item 엔티티의 name 필드를 기준으로 Item 엔티티를 조회하는 함수를 추가해줘
결과
@Repository
@RequiredArgsConstructor
public class ItemRepository {
private final EntityManager em;
// 기존 메서드들...
public Item findByName(String name) {
try {
return em.createQuery("select i from Item i where i.name = :name", Item.class)
.setParameter("name", name)
.getSingleResult();
} catch (NoResultException ex) {
return null; // 해당 이름과 일치하는 아이템이 없을 경우 null을 반환
}
}
}