테스트 코드를 돌려보던 중, 작성한 쿼리문에서 다음과 같은 오류가 발생했다.
Caused by: java.lang.IllegalArgumentException: org.hibernate.query.sqm.UnknownEntityException: Could not resolve root entity 'users'
원인 분석
@Repository
public class UserRepository {
@PersistenceContext
EntityManager em;
--- 생략
public List<User> findAll() {
return em.createQuery("select m from Users m", User.class)
.getResultList();
}
public Optional<User> findByLoginId(String loginId) {
return findAll().stream()
.filter(m->m.getLoginId().equals(loginId))
.findFirst();
}
}
문제는 findAll() 메서드의 작성된 쿼리문에 있었다.
쿼리에서 작성된 엔티티 클래스 이름은 실제 엔티티 클래스 이름과 동일해야 한다.
@Entity
@Getter @Setter
@Table(name="Users")
public class User {
}
user란 이름이 대부분의 데이터베이스에서 예약어다보니 Table 어노테이션의 name 속성을 통해 테이블명을 Users로 바꿨다.
나는 바뀐 테이블명으로 쿼리문에 명시해야 인식할 줄 알았는데, 실제로는 엔티티 이름 그대로 사용해야 했다.