Querydsl

zipkyh 2,242 views 113 slides Jul 15, 2015
Slide 1
Slide 1 of 121
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96
Slide 97
97
Slide 98
98
Slide 99
99
Slide 100
100
Slide 101
101
Slide 102
102
Slide 103
103
Slide 104
104
Slide 105
105
Slide 106
106
Slide 107
107
Slide 108
108
Slide 109
109
Slide 110
110
Slide 111
111
Slide 112
112
Slide 113
113
Slide 114
114
Slide 115
115
Slide 116
116
Slide 117
117
Slide 118
118
Slide 119
119
Slide 120
120
Slide 121
121

About This Presentation

2012 KSUG 세미나에서 발표한 Querydsl에 대한 내용입니다.


Slide Content

QueryDSL
type-safeQuery
&?+?)v:?(?+?
12?1257i? i

&~*O
•&?)?
•JPAQuery
•QueryDSL?
•QueryDSL-JPA
•?$?'?+?'?
•SpringDataJPA+Querydsl
12?1257i? i

&?)?
12?1257i? i

??)"?'?+?
•h'?)?d*v]
•$a)h
•)h&S
•+b?(E_10')y...
12?1257i? i

?$?*v]
이정도는 발로
만들어 주지
12?1257i? i

*?&;*v]
Stringsql=
“select*frommember”+
“wherenamelike?”+
“andagebetween?and?”
12?1257i? i

*?+”)k(?&/
12?1257i? i

&?+?(?&/
12?1257i? i

+b?(?&/
12?1257i? i

&??&?'?
12?1257i? i

&;*?(?&/??
?%?&;](?(?
'&z'=%w$?'??+?(?!
12?1257i? i

&??
Stringsql=
“select*frommember”+
“wherenamelike?”+
“andagebetween?and?”
[+?*?&v]
“select*frommemberwherename
like?andagebetween?and?”
12?1257i? i

QUERY)c&?)?)|
•QUERY$?&?)v,Type-check':]$?
•(I+?+?'?)y?)?)w%Q(?'6,:)j':]
12?1257i? i

(?%?$?*?q2])?
•*?+”)k(?%?()?)V(?%?)
•%?+*)o(?%?($a'?(?%?)
12?1257i? i

%G&k)j?'??
)ySQL)W'g&;)w'?+??
)C+?*?%?&z)%G$?&}%A
(?),$?$?$?.
SELECTNAME,AGE..
12?1257i? i

SQL...
•&d(?SQL)hClass*i%?Type)h)r?Java*?
%w%?)w'?+?'?)r$?&v?
•type-safe
12?1257i? i

Type-safe
•*?+”)k(E(?%?*r*?]$?
•Code-assistantx100!!!
•CTRL+SPACE+.(DOT)
12?1257i? i

QueryDSL-SQL
•SQL)WJava%?type-safe+?qo&?+?'?
)r$?+?%?)o)4*?
12?1257i? i

QueryDSL-SQL
12?1257i? i

QueryDSL
•+?)?&d)??)VORM(E% ????
12?1257i? i

JPAQuery
javaORM
12?1257i? i

)?&?:'?%?)W*Y(?')v
•20~40'?
•'?=?(
•$a)h&e)V'?'?
•3&z)W*y%?+?%?.
12?1257i? i

,D)6
@Entity
publicclassMember{
@Id@GeneratedValue
privateLongid;
privateStringname;
privateintage;
...
}
12?1257i? i

,D)6Table
createtableMember(
idbigintautoprimarykey,
ageintegernotnull,
namevarchar(255)
)
12?1257i? i

JPA(?'?QUERY&?&?)V
*?q3])?
•1.JPQL(HQL)
•2.CriteriaAPI
•3.MetaModelCriteriaAPI(type-safe)
12?1257i? i

1.JPQL(HQL)
@Test
publicvoidjpaJpqlQuery(){

Stringquery=
"selectmfromMemberm"+
"wherem.agebetween20and40"+
"andm.namelike'?%'"+
"orderbym.agedesc";

List<Member>resultList=
entityManager.createQuery(query,Member.class)
.setMaxResults(3).getResultList();

}
12?1257i? i

1.JPQL(HQL)
•)b)|:SQLQUERY(?'Y(C+?'?
?&?)i'?+?)?
•$?)|:type-safe(?$?
%Q)x*?&;'?'?)h(?%?)0
12?1257i? i

2.CriteriaAPI
@Test
publicvoidjpaCriteriaQuery(){

CriteriaBuildercb=entityManager.getCriteriaBuilder();
CriteriaQuery<Member>cq=cb.createQuery(Member.class);
Root<Member>root=cq.from(Member.class);

Path<Integer>age=root.get("age");
Predicatebetween=cb.between(age,20,40);
Path<String>path=root.get("name");
Predicatelike=cb.like(path,"?%");

CriteriaQuery<Member>query=cq.where(cb.and(between,like));
query.orderBy(cb.desc(age));

List<Member>resultList=
entityManager.createQuery(query).setMaxResults(3).getResultList();
}
12?1257i? i

2.CriteriaAPI
12?1257i? i

2.CriteriaAPI
selectid,age,name
fromMEMBER
whereagebetween20and40andnamelike'?%'
orderbyagedesclimit3
12?1257i? i

2.CriteriaAPI
•)b)|:%Q)x*?&;'?'?)h(.)0??
•$?)|
•1.type-safe(?$?
•2.'!)~+?
•3.(?(?(?+?q$?&?&e)Y
•4.?bEJB?'6+?%x]'??$i...
12?1257i? i

3.MetaModelCriteriaAPI
(type-safe)
•root.get("age")->root.get(Member_.age)
•CriteriaAPI+MetaModel
•CriteriaAPI(?b)c%Q)k
•type-safe
•'!)~+??&b*Q])?
12?1257i? i

)hd(?$?(?--;
timowest
12?1257i? i

QueryDSL
12?1257i? i

QueryDSL''?
•Query:&?)c,)?,D,)?&?,?
•Query!=SQL
12?1257i? i

QueryDSL''?
•Domain(%G&k)j)
•Specific(+`,9)
•Language((?(?)
12?1257i? i

DSL
•%G&k)j++`,9+(?(?
•+`)+?%G&k)j(?*a)|)W&n*x)?+?)x)j
+?,$%?)W])?*?+?+?+?%??%?&?(?(?
•+`)?:$?'?,_~,)K*X
12?1257i? i

QueryDSL
•)?,D+%G&k)j++`,9+(?(?
•)?,D(?+`,9%;+?%??%?&?(?(?
12?1257i? i

[Persistence]
JPA,JDO,SQL,JAVACollections,
RDF,Lucene,HibernateSearch,
MongoDb
QueryDSLAPI
%)h+?)?,D?$?*v'?,9
12?1257i? i

QueryDSL?
•type-safe
•)?,D(?+`,9%;+?%??%?&?(?(?
•$?'?,_~,)K*X
•$?(?+?)w)b'?)?,D?$?+]+?
12?1257i? i

QueryDSL?
•JPA,JDO,SQLl)VBackends&R)C+?
type-safeSQL)W&d%w$?+?%?)o)4*?
12?1257i? i

Type-safe
QueryType'?'?
Member java
Member table
Member ...
QMEMBER
.java
*?%w
'?'??
'?'?
12?1257i? i

*?%w'?'??
•APT:AnnotationProcessingTool

@Deprecated

@Override

@SuppressWarning

@Entity
•TableMeta:Querydsl-maven-plugin
12?1257i? i

QueryDSL-JPA
12?1257i? i

Querydsl-JPA
•Querydsl)VJPQL(HQL))Wtypesafe+?
q)w'?+??)C+?&d%{(?)?
•$?&R)C+?&d%{(?$?!
12?1257i? i

)?&?:'?%?)W*Y(?')v
•20~40'?
•'?=?(
•$a)h&e)V'?'?
•3&z)W*y%?+?%?.
12?1257i? i

,D)6Table
createtableMember(
idbigintautoprimarykey,
ageintegernotnull,
namevarchar(255)
)
12?1257i? i

,D)6
@Entity
publicclassMember{
@Id@GeneratedValue
privateLongid;
privateStringname;
privateintage;
...
}
12?1257i? i

QueryDSL-JPA
Member.java
@Entity
QMember
.java
APT
'?'?
12?1257i? i

@Generated("com.mysema.query.codegen.EntitySerializer")
publicclassQMemberextendsEntityPathBase<Member>{
publicfinalNumberPath<Long>id=createNumber("id",Long.class);
publicfinalNumberPath<Integer>age=createNumber("age",Integer.class);
publicfinalStringPathname=createString("name");
publicstaticfinalQMembermember=newQMember("member");
...
}
)v%Q'?'?%;,D)6Query
12?1257i? i

QMemberm=QMember.member
query.from(m)
.where(
m.age.between(20,40),
m.name.like("?%")
)
.orderBy(m.age.desc())
.limit(3)
.list(m);
Querydsl-JPA
12?1257i? i

JPAQueryquery=newJPAQuery(entityManager);

QMemberm=QMember.member;

List<Member>list=query.from(m).where(
m.age.between(20,40).and(m.name.like("?%"))
)
.orderBy(m.age.desc()).limit(3)
.list(m);Querydsl-JPA
12?1257i? i

'?'?%;*?&;
selectid,age,name
fromMEMBER
whereagebetween20and40
andnamelike'?%'
orderbyagedesc
limit3
12?1257i? i

)w%Q&?(F
SQLJPQLQUERYDSL
'?'? '?'?
12?1257i? i

Querydsl-JPA
•)b)|
•type-safe
•$?'?+?
•(.)0
•EJB->Spring)%G)c*O)h?
•$?)|
•APT&R'?)+?(?+?
12?1257i? i

?$?'?+?'?
QueryDSL-JPA
12?1257i? i

?'?
Query
ex)from,where,join
Path
ex)QMember,QMember.name
Expression
ex)name.eq,name.gt
12?1257i? i

?$?'?+?'?

from

innerJoin,join,leftJoin,fullJoin,on

where(and,or,allOf,anyOf)

groupBy

having

orderBy(desc,asc)

limit,offset,restrict(limit+offset)(Paging)
12?1257i? i

?$?'?+?'?

list

listResults(list+PagingInfo(totalCount))

iterate

count

singleResult,uniqueResult
12?1257i? i

$?'?*?&;
JPAQueryquery=newJPAQuery(entityManager);
QMemberm=QMember.member;

List<Member>results=query.from(m)
.where(m.name.startsWith("?").and(m.age.between(20,40)))
.list(m);
12?1257i? i

%Q)x*?&;
StringfirstName="?";intmin=20,max=40;


BooleanBuilderbuilder=newBooleanBuilder();
if(StringUtils.hasText(str))
builder.and(m.name.startsWith(firstName));

if(min!=0&&max!=0)
builder.and(m.age.between(min,max));

List<Member>results=query.from(m).where(builder).list(m);
12?1257i? i

)?)j*?&;
QMemberm=QMember.member;
QMemberCardmc=QMemberCard.memberCard;

List<Member>list=
query.from(m).join(m.memberCards,mc)
.list(m);
12?1257i? i

)?)j*?&;+fetch
QCardc=QCard.card;
QMemberm=QMember.member;
QMemberCardmc=QMemberCard.memberCard;

List<Member>list=
query.from(m)
.join(m.memberCards,mc).fetch()
.join(mc.card,c).fetch()
.list(m);

for(Membermember:list){
out.println(member.getMemberCards().get(0).getCard().getName());
}
12?1257i? i

'?'R*?&;
query.from(m).where(
m.in(
newJPASubQuery().from(m)
.where(m.age.between(20,40)).list(m))
).list(m);
12?1257i? i

DTO
QMember$member=QMember.member;
QMemberCard$memberCard=QMemberCard.memberCard;
QCard$card=QCard.card;

List<MemberDTO>list=query.from($member)
.join($member.memberCards,$memberCard)
.join($memberCard.card,$card)
.list(Projections.bean(MemberDTO.class,
,$member.id
,$member.name
,$member.age
,$card.name.as("cardName")
));
publicclassMemberDTO{Longid,Stringname,intage,StringcardName}
12?1257i? i

DTO+@QueryProjection
QMember$member=QMember.member;
QMemberCard$memberCard=QMemberCard.memberCard;
QCard$card=QCard.card;

List<MemberDTO>list=query.from($member)
.join($member.memberCards,$memberCard)
.join($memberCard.card,$card)
.list(newQMemberDTO($member.id,$member.name,$member.age
,$card.name));
@QueryProjection
publicMemberDTO(Longid,Stringname,intage,StringcardName)
12?1257i? i

@QueryDelegate
publicclassMemberExpression{
@QueryDelegate(Member.class)
publicstaticBooleanExpressionisAdult(QMember$){
return$.age.gt(20);
}
@QueryDelegate(Member.class)
publicstaticBooleanExpressionisVip(QMember$){
return$.age.gt(50);
}
}
QMember$m=QMember.member;
query.from(m)
.where(m.isAdult())
.list(m);
12?1257i? i

+?)h)?,)%?
SearchResults<Member>listResults=
query.from(m)
.offset(0).limit(10)
.orderBy(m.age.desc())
.listResults(m);
System.out.println("totalcount="+listResults.getTotal());
List<Member>results=listResults.getResults();
12?1257i? i

SpringDataJPA
+Querydsl
12?1257i? i

SpringData&~)x
•$?(?+?DataAccess&R(<+?&a?+]+?
•$?(?+?DataAccess&R(3qo&?+?%G%?
%G)0
•?+*%a%a...
12?1257i? i

[DataAccessLayer]
JPA
JDBCExtension
ApacheHadoop
GemFire,Redis,MongoDB...
SpringData
SpringData)?)6
12?1257i? i

SpringDataJPA_%?
•JPA?&?DataAccessLayero&?)W$?'?
,9+?
12?1257i? i

Repository
•)j+?+?)h(<'?(?&d)T%?EntityRepository
(?'?(Generic)
•?,$*?%?(<$?%?+*)o(?)v%Q)T%?'?'?%=
interfaceMemberRepositoryextends
JpaRepository<Member,Long>{
}
12?1257i? i

interfaceMemberRepositoryextends
JpaRepository<Member,Long>{
}
'6&}Repository
•'6&}Interface
•%a%?,'?),'?)?
•)?,D,+?)h)?,)%?
•)h&}%yj)h?)?!
12?1257i? i

methodname*?&;'?'?
publicinterfaceMemberRepositoryextendsJpaRepository<Member,Long>{
publicList<Member>findByName(Stringname);

}
•&k'?%w)h&S&d)?(?)?&v$a&`)?(?(?'?...
•select*frommemberwhere
name=:name
12?1257i? i

SpringDataJPA
%)h+?)?,D?$?
•methodname*?&;'?'?
•Specfication(DDD)
•QueryDSL
•JPQL()hd+?(<)
12?1257i? i

methodname*?&;'?'?
List<Member>list=memberRepository
.findByNameStartingWithAndAgeBetweenOrderByAgeDesc("?",20,40);

publicinterfaceMemberRepository...{
publicList<Member>findByNameStartingWithAndAgeBetweenOrderByAgeDesc
(Stringstring,intmin,intmax);
}
12?1257i? i

methodname*?&;'?'?
•)b)|:'?'?(?'?])b(K+?,+?&;
•$?)|
•%Q)x*?&;X
•)?+?)h':]$?->&k'?%w]&?+?)?]
•h'?)?d)h&e)T&v$?&??(?)?
•~%?:_$?+?j(?&d(s)v
12?1257i? i

DDDSpecification
12?1257i? i

Specfication(DDD)
Specification<Member>firstNameLike=MemberSpecs.isFirstName("?");
Specification<Member>ageBetween=MemberSpecs.ageBetween(20,40);

Specifications<Member>specs=
Specifications.where(firstNameLike).and(ageBetween);

List<Member>list=memberRepository.findAll(specs);
12?1257i? i

publicstaticclassMemberSpecs{
publicstaticSpecification<Member>isFirstName(finalStringfirstName){
returnnewSpecification<Member>(){
@Override
publicPredicatetoPredicate(Root<Member>root,CriteriaQuery<?>query,
CriteriaBuildercb){
Path<String>namePath=root.get("name");
returncb.like(namePath,firstName+"%");
}
};
}
publicstaticSpecification<Member>ageBetween(finalintmin,finalintmax){
returnnewSpecification<Member>(){
@Override
publicPredicatetoPredicate(Root<Member>root,CriteriaQuery<?>query,
CriteriaBuildercb){
Path<Integer>age=root.get("age");
returncb.between(age,min,max);
}
};
}
}
12?1257i? i

Specfication(DDD)
•)b)|
•)d'?))]$?,)?+?]$?
•$?)|
•JPACriteriaAPI'?)),'!)~,(?%?)0
•type-safe(?$?(MetaModel'(?]$?)
•'!)~+?Specs..&?'$?&?$=)h*?'?,>
12?1257i? i

SpringData+QueryDSL
QMemberm=QMember.member;

Iterable<Member>results=memberRepository.findAll(
m.name.startsWith("?").and(m.age.between(20,40))
);
publicinterfaceMemberRepositoryextendsJpaRepository<Member,Long>,
QueryDslPredicateExecutor<Member>{}
12?1257i? i

SpringData+QueryDSL
•)b)|
•)d'?))]$?,)?+?]$?
•type-safe
•)hd(c(?+?!
12?1257i? i

)hb&v$w)b!
12?1257i? i

)?)j*?&;)?)?'$??
12?1257i? i

join)h+?)"+?!
QMemberm=QMember.member;

Iterable<Member>results=memberRepository.findAll(
m.name.startsWith("?").and(m.age.between(20,40))
);
)s???
)?)j)V(?%c(????
12?1257i? i

timowest
'!)~+?dJPAQueryinstance&R
)?)}'?))+?(?+?$?$?.
12?1257i? i

SpringData+Querydsl
+??
•Querydsl)c&}%y?$?)W(v'?(?$?.
•ex)join,fetch%aQuery?$?':]$?
•subQuery)%G$?]$?
•+?)h)?,Order](?*")h)??(?$?&S
12?1257i? i

•SpringData+?%?)?+~)c(?)|)V)?,D
•Querydsl%?)?,D?$?'(?
SpringData+Querydsl
)&;
12?1257i? i

SpringData+Querydsl
)&;
•$?'?+??)*:SpringData+Querydsl
•'!)~+??)*:Querydsl)?)}'?))
•SpringData(?'?Querydsl)c%)&e)V?
$?)W)?)6+??)C+?)x?$?%?)?
12?1257i? i

,0(E$a+?'?...
•QueryDSL)cServiceLayer*?+g$?
)?(?%G(?%;$?!%??'??+?(E&v...
•QueryDslRepositorySupport
12?1257i? i

,0(E$a+?'?...
•maven-apt-plugin(1.0.6)X
•apt-maven-plugin(1.0.6)O
12?1257i? i

QueryDSL~%?
•+?&?(c'&v%K(?(?'?(?)Y
•SpringData(?'?%G&??)r)Y
•d%Q)c*?+”)k(?%?
•d%Q)cctrl+space,Code-assistant
•&??]]$s)r)?&d*?&?+?](?)y(?))x
•)?)?'!)~+?j)V(a*?&;'?))
12?1257i? i

*T?)v&/
•QueryDSLhttp://www.querydsl.com/
•QueryDSLPPThttp://www.slideshare.net/timowestkamper
•SpringDataJPAhttp://www.springsource.org/spring-data/jpa
•BOOK'?+?'?(<https://github.com/SpringSource/spring-data-book
•)?(?,/$?'U%??,DSL'?&zhttp://aeternum.egloos.com/2962600
12?1257i? i

d'?+?$?$?.
12?1257i? i

*v]
Querydsl-Collections
Querydsl-SQL
12?1257i? i

Querydsl-
JavaCollections
12?1257i? i

)?&?
•'?%?)W*Y(?')v
•20~40'?)?'?)h?()j'?%?)W*Y?$a
)h]&e)V'?'?%%?3&z)W*y%?+?%?.
12?1257i? i

,D)6
publicclassMember{
privateStringname;
privateintage;
...
}
12?1257i? i

@Test
publicvoidjava(){

List<Member>members=createDatas();
List<Member>list=newArrayList<Member>();

for(Membermember:members){

if(member.getAge()>=20){
if(member.getAge()<=40){
if(member.getName().startsWith("?")){
list.add(member);
}
}
}
}

//$a)h'?)T%?)%?...--;(?)y?(?)?'?'?%?+?$?$?.
//3&z&d's$?j%G'?%?+?$?$?.

for(Membermember:list){
System.out.println(member.getName()+"/"+member.getAge());
}
}
12?1257i? i

QueryDSL-
Collections
Member
.java
QMember
.java
APT
'?'?
12?1257i? i

,D)6
@QueryEntity
publicclassMember{
privateStringname;
privateintage;
...
}
12?1257i? i

@Generated("com.mysema.query.codegen.EntitySerializer")
publicclassQMemberextendsEntityPathBase<Member>{
publicfinalStringPathname=createString("name");
publicfinalNumberPath<Integer>age=
createNumber("age",Integer.class);
publicstaticQMembermember=newQMember("member");
...
}
)v%Q'?'?%;,D)6Query
12?1257i? i

importstaticcom.mysema.query.collections.MiniApi.*;
@Test
publicvoidcollectionQuerydsl(){

List<Member>members=createDatas();
QMemberm=QMember.member;

List<Member>list=from(m,members).where(
m.age.between(20,40).and(m.name.like("?%"))
)
.orderBy(m.age.desc()).limit(3).list(m);

for(Membermember:list){
System.out.println(member.getName()+"/"+member.getAge());
}
}
12?1257i? i

JavaCollections~%?
•)?(?')p$?$?!
•+?)?&d...,$(I(?'?DB-SQL%?$w$r(?+?
$?)k
12?1257i? i

Querydsl-SQL
12?1257i? i

)?&?
•'?%?)W*Y(?')v
•20~40'?)?'?)h?()j'?%?)W*Y?$a
)h]&e)V'?'?%%?3&z)W*y%?+?%?.
12?1257i? i

,D)6
publicclassMember{
privateLongid;
privateStringname;
privateintage;
...
}
12?1257i? i

,D)6Table
createtableMember(
idbigintautoprimarykey,
ageintegernotnull,
namevarchar(255),
)
12?1257i? i

*?&;&d%{?
selectm.ID,m.AGE,m.NAME
fromMEMBERm
wherem.AGE
between20and40
andm.NAMElike'?%'
orderbym.AGEdesc
limit3
12?1257i? i

*?&;->DTO
)hd'?%?+?$*)"--;...
12?1257i? i

QueryDSL-SQL
Member
TABLE
QMember
.java
'?'?
querydsl-maven-plugin
12?1257i? i

@Generated("com.mysema.query.sql.codegen.MetaDataSerializer")
publicclassQMemberextends...RelationalPathBase<Member>{
publicstaticfinalQMembermember=newQMember("MEMBER");
publicfinalNumberPath<Long>id=createNumber("ID",Long.class);
publicfinalNumberPath<Integer>age=createNumber("AGE",Integer.class);
publicfinalStringPathname=createString("NAME");
...
}
)v%Q'?'?%;,D)6Query
12?1257i? i

@Test
publicvoidsqlQuerydsl()throwsException{
SQLQueryquery=createQuery();
QMemberm=QMember.member;

List<MemberDTO>list=query.from(m).where(
m.age.between(20,40).and(m.name.like("?%"))
)
.orderBy(m.age.desc()).limit(3)
.list(Projections.bean(MemberDTO.class,m.id,m.name,m.age);

for(MemberDTOmember:list){
System.out.println(member);
}

}
privateSQLQuerycreateQuery()throwsException{
Class.forName("net.sf.log4jdbc.DriverSpy");
Connectionconn=DriverManager.getConnection("jdbc:log4jdbc:hsqldb:hsql://localhost");
SQLTemplatesdialect=newHSQLDBTemplates();
SQLQueryquery=newSQLQueryImpl(conn,dialect);
returnquery;
}
12?1257i? i

)v%Q'?'?%;*?&;
selectm.ID,m.AGE,m.NAME
fromMEMBERm
wherem.AGE
between20and40
andm.NAMElike'?%'
orderbym.AGEdesc
limit3
12?1257i? i

Querydsl-SQL)??%)
•innerJoin,join,leftJoin,fullJoin
•groupBy
•having
•orderBy
•subquery
•insert,update,delete
12?1257i? i

Querydsl-SQL)??%)
QSurveysurvey=QSurvey.survey;

newSQLInsertClause(conn,dialect,survey)
.columns(survey.id,survey.name)
.values(3,"Hello").execute();
QSurveysurvey=QSurvey.survey;
newSQLUpdateClause(conn,dialect,survey)
.where(survey.name.eq("XXX"))
.set(survey.name,"S")
.execute();
QSurveysurvey=QSurvey.survey;
newSQLDelecteClause(conn,dialect,survey)
.where(survey.name.eq("XXX"))
.execute();
QCustomercustomer=QCustomer.customer;
QCompanycompany=QCompany.company;
query.from(customer)
.innerJoin(customer.company,company)
.list(customer.firstName,customer.lastName,
company.name);
12?1257i? i

DTO)v%Q'?'??$?
•(?'?&d+"&vDTO%G)v%Q'?'?]$?
•MEMBERTABLE->MEMBER.java
12?1257i? i

DTO)v%Q'?'??$?
+?)?&d...
•DTO(?(????$?&d%{(?)?)?(?)Y
•TABLE->DTO)v%Q'?'?)V1:1)j?)*&d
(v&d+?
•DTO&R'?)+?'?(?$?.
•Querydsl)VORM)h(?$?
12?1257i? i

Querydsl-SQL~%?
•)b)|:type-safe
•)?)c)|:FK&R&z,:+?q'?)+?(?+?$?.
12?1257i? i