member.username.eqq("member2D) // username = 'member1'
member.username.ne("member") // username != 'member1'
member.username.eq("member1").not() // username != 'member1'
member.username.isNotNull() // 이름이 is not null
member.age.in(10, 20) // age in (10, 20)
member.age.notin(10, 20) // age not in (10, 20)
member.age.between(10, 30) // between 10, 30
member.age.goe(30) // age >= 30
member.age.gt(30) // age > 30
member.age.loe(30) // age <= 30
member age.lt(30) // age < 30
member.username.like("member%") // like 검색
member.username.contains("member") // like '%memeber%' 검색
member.username.startWith("member") // like 'member%' 검색
package com.codingbox.querydsl.main;
// static을 포함한 전체를 import한다.
import static com.codingbox.querydsl.entity.QMember.*;
import static com.codingbox.querydsl.entity.QTeam.*;
import java.util.List;
import com.codingbox.querydsl.entity.Member;
import com.codingbox.querydsl.entity.QMember;
import com.codingbox.querydsl.entity.Team;
import com.querydsl.core.Tuple;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Persistence;
public class Main06 {
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
em.persist(teamA);
em.persist(teamB);
Member member1 = new Member("member1", 10, teamA);
Member member2 = new Member("member2", 20, teamA);
Member member3 = new Member("member3", 30, teamB);
Member member4 = new Member("member4", 40, teamB);
Member member5 = new Member(null, 100, teamB);
Member member6 = new Member("member6", 100, teamB);
Member member7 = new Member("member7", 100, teamB);
em.persist(member1);
em.persist(member2);
em.persist(member3);
em.persist(member4);
em.persist(member5);
em.persist(member6);
em.persist(member7);
// 초기화
em.flush();
em.clear();
// inner join
List<Tuple> result2 = queryFactory
.select(member, team)
.from(member)
.join(member.team, team).on(team.name.eq("teamA"))
.fetch();
for( Tuple tuple : result2 ) {
System.out.println("tuple = " + tuple);
}
// inner join에 on절과 where절 둘 다 써도 상관없지만 where절을 더 권장함.(가독성)
List<Tuple> result3 = queryFactory
.select(member, team)
.from(member)
.join(member.team, team)
.where(team.name.eq("teamA"))
.fetch();
for( Tuple tuple : result3 ) {
System.out.println("tupleWhere = " + tuple);
}
/*
* 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원 모두 조회
* SQL : select m.*, t.*
* from Member m
* left (outer) join Team t
* ON m.team_id = t.id and t.name = 'teamA'
*
* jpql : select m, t
* from Member m
* left join m.team t
* on t.name = "teamA"
*/
// List<Tuple> result = queryFactory
// .select(member, team)
// .from(member)
// .leftJoin(member.team, team).on(team.name.eq("teamA"))
// .fetch();
// on절만 있는 것과 where절이 추가 된 것은 조회되는 row수가 다르다.
List<Tuple> result = queryFactory
.select(member, team)
.from(member)
.leftJoin(member.team, team).on(team.name.eq("teamA"))
.where(team.name.eq("teamA"))
.fetch();
for( Tuple tuple : result ) {
System.out.println("tuple = " + tuple);
}
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
emf.close();
}
}
}
// select 절에서 subquery
QMember memberSub4 = new QMember("memberSub4");
List<Tuple> fetch = queryFactory
.select(member.username,
JPAExpressions
.select(memberSub4.age.avg())
.from(memberSub4))
.from(member)
.fetch();
for( Tuple tuple : fetch ) {
System.out.println("username = " + tuple.get(member.username));
System.out.println("age = " +
tuple.get(JPAExpressions.select(memberSub4.age.avg())
.from(memberSub4)));
}
// in 절
QMember memberSub3 = new QMember("memberSub3");
List<Member> result3 = queryFactory
.selectFrom(member)
.where(member.age.in(
JPAExpressions.select(memberSub3.age)
.from(memberSub3)
.where(memberSub3.age.gt(10))))
.fetch();
// 나이가 평균 나이 이상인 회원
QMember memberSub2 = new QMember("memberSub2");
List<Member> result2 = queryFactory
.selectFrom(member)
.where(member.age.goe(
JPAExpressions.select(memberSub2.age.avg())
.from(memberSub2)
))
.fetch();
System.out.println("result2 : " + result2.get(0).getAge());
// 서브쿼리 - 나이가 가장 많은 회원 조회
QMember memberSub = new QMember("memberSub");
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(
JPAExpressions.select(memberSub.age.max())
.from(memberSub)
))
.fetch();
System.out.println("result : " + result.get(0).getAge());
// Case 문
List<String> result = queryFactory
.select(
member.age
.when(10).then("열살")
.when(20).then("스무살")
.otherwise("기타")
)
.from(member)
.fetch();
// 복잡한 조건
List<String> result2 = queryFactory
.select(new CaseBuilder()
.when(member.age.between(0, 20)).then("0~20살")
.when(member.age.between(21, 30)).then("21~30살")
.otherwise("기타"))
.from(member)
.fetch();
for( String s : result2 ) {
System.out.println("s : " + s);
}
List<String>
List<Member>
List<Tuple>
: 대상이 둘 이상일 때, 특정할 수 없을 때