데이터베이스 테이블은 아래와 같이 세팅해주었다.
String qlString =
"select m from Member m" +
" where m.username = :username";
Member findMember = em.createQuery(qlString, Member.class)
.setParameter("username", "member1")
.getSingleResult();
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QMember m = new QMember("m");
Member findMember = queryFactory
.select(m)
.from(m)
.where(m.username.eq("member1"))
.fetchOne();
QMember qMember = new QMember("m"); //별칭 직접 지정
QMember qMember = QMember.member; //기본 인스턴스 사용
기본 인스턴스를 static import 해서 사용하는 방법을 권장한다!
같은 테이블을 조인해야 하는 경우가 아니라면 기본 인스턴스를 사용하자.
Member findMember = queryFactory
.select(member)
.from(member)
.where(member.username.eq("member1"))
.fetchOne();
아래 설정을 추가하면 실행되는 JPQL 을 확인할 수 있다.
spring.jpa.properties.hibernate.use_sql_comments: true
JPQL이 제공하는 모든 검색 조건을 제공한다.
Member findMember = queryFactory
.selectFrom(member)
.where(member.username.eq("member1")
.and(member.age.eq(10)))
.fetchOne();
조건이 and 로 연결될 경우, 아래 코드와 같이 and 대신에 , 를 사용해도 된다. 이 방법의 경우, null 이 들어갔을 때 null 은 무시하기 때문에 동적 쿼리를 짤 때 유용하다.
Member findMember = queryFactory
.selectFrom(member)
.where(member.username.eq("member1"),
member.age.eq(10))
.fetchOne();
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(100))
.orderBy(member.age.desc(), member.username.asc().nullsLast())
.fetch();
List<Member> result = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1)
.limit(2)
.fetch();