어제 궁금했던 JPAQueryFactory뿐만 아니라 JPQL에 대해서도 공부했다.
이전에 포스팅 한 것 처럼, JPQL(Java Persistence Query Language)은 SQL과 유사하지만 객체를 대상으로 하는 쿼리 언어이다.
Table 이 아닌 Entity(객체) 기준으로 작성하며, 이를 사용할 수 있도록
EntityManger
또는@Query
구현체를 통해 JPQL 쿼리를 사용할 수 있다.
@Test
public void testEmCreateQuery() {
String qlString = "select u from User u " +
"where u.username = :username";
Member findUser = em.createQuery(qlString, User.class)
.setParameter("username", "teasun")
.getSingleResult();
assertThat(findUser.getUsername()).isEqualTo("teasun");
}
이렇게 문자열이 들어가는데, 좋지 않아보인다.
@Query
는 개발자가 직접 JPQL 또는 네이티브 SQL 쿼리를 정의하여 인자값으로 간단하게 쿼리를 작성할 수 있게 해준다.
(쿼리를 작성할때는 테이블명이 아니라 Entity 명으로 조회)
@Query("select c from Comment c join fetch c.board")
List<Comment> findAllWithNativeQuery();
public interface UserRepository extends JpaRepository<User, Long> {
// ?변수순번 사용
@Query("SELECT u FROM User u WHERE u.username = ?1")
List<User> findByUsername(String username, Sort sort);
// :변수명 사용
@Query("SELECT u FROM User u WHERE u.username = :username")
List<User> findByUsername(String username, Sort sort);
}
어제 궁금했던 부분!
QueryDSL이란 Entity의 매핑정보를 활용하여 쿼리에 적합하도록 쿼리 전용 클래스(Q클래스)로 재구성해주는 기술이다.
JPAQueryFactory 을 통한 Q클래스를 활용할 수 있는 기능들을 제공한다.
@PersistenceContext
EntityManager em;
public List<User> selectUserByUsernameAndPassword(
String username,
String password
) {
JPAQueryFactory jqf = new JPAQueryFactory(em);
QUser user = QUser.user;
List<Person> userList = jpf
.selectFrom(user)
.where(person.username.eq(username)
.and(person.password.eq(password))
.fetch();
return userList;
}
내장 기능이라서 완벽히 이해가 된다기보다는 이런식으로 사용하는구나~ 싶다.