JPQL 혹은 native SQL을 사용하는 경우 쿼리문의 타입 안전성을 보장할 수 없다. 컴파일 과정에서 쿼리를 검증할 수 없기 때문에 잘못 작성한 쿼리에 대해서는 런타임 에러로만 문제를 발견할 수 있다.
해법 Criteria API는 쿼리문을 문자열이 아닌 프로그램 소스 코드처럼 작성할 수 있게 해준다.
public List<UserEntity> findByUsername(String username) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<UserEntity> query = builder.createQuery(UserEntity.class);
Root<UserEntity> root = query.from(UserEntity.class);
query = query.select(root).where(builder.and(builder.equal(root.get("username", "yeeun"));
return em.createQuery(query).getResultList();
}