1
1
package com .oreilly .springdata .jdbc .repository ;
2
2
3
+ import com .mysema .query .sql .SQLQuery ;
3
4
import com .mysema .query .sql .dml .SQLDeleteClause ;
4
5
import com .mysema .query .sql .dml .SQLInsertClause ;
5
6
import com .mysema .query .sql .dml .SQLUpdateClause ;
6
7
import com .mysema .query .types .Path ;
8
+ import com .mysema .query .types .Predicate ;
7
9
import com .oreilly .springdata .jdbc .domain .Address ;
8
10
import com .oreilly .springdata .jdbc .domain .Customer ;
9
11
import com .oreilly .springdata .jdbc .domain .EmailAddress ;
@@ -38,45 +40,63 @@ public class QueryDslCustomerRepository implements CustomerRepository {
38
40
39
41
private final QAddress qAddress = QAddress .address ;
40
42
41
- private QueryDslJdbcTemplate template ;
43
+ private QueryDslJdbcTemplate qdslTemplate ;
42
44
43
45
private Path [] customerAddressProjection ;
44
46
45
47
@ Autowired
46
48
public void setDataSource (DataSource dataSource ) {
47
- this .template = new QueryDslJdbcTemplate (dataSource );
49
+ this .qdslTemplate = new QueryDslJdbcTemplate (dataSource );
48
50
customerAddressProjection = new Path [] {
49
51
qCustomer .id , qCustomer .firstName , qCustomer .lastName , qCustomer .emailAddress ,
50
52
qAddress .id , qAddress .customerId , qAddress .street , qAddress .city , qAddress .country };
51
53
}
52
54
53
55
@ Override
54
56
@ Transactional (readOnly = true )
55
- public Customer findOne (Long id ) {
56
- return template .queryForObject (
57
- template .newSqlQuery ()
58
- .from (qCustomer )
59
- .leftJoin (qCustomer ._addressCustomerRef , qAddress )
60
- .where (qCustomer .id .eq (id )),
61
- new CustomerExtractor (),
62
- customerAddressProjection );
57
+ public Customer findById (Long id ) {
58
+ if (id == null ) {
59
+ return null ;
60
+ }
61
+ return findOne (qCustomer .id .eq (id ));
63
62
}
64
63
65
64
@ Override
66
65
@ Transactional (readOnly = true )
67
66
public List <Customer > findAll () {
68
- return template .query (
69
- template .newSqlQuery ()
70
- .from (qCustomer )
71
- .leftJoin (qCustomer ._addressCustomerRef , qAddress ),
67
+ SQLQuery allCustomersQuery = qdslTemplate .newSqlQuery ()
68
+ .from (qCustomer )
69
+ .leftJoin (qCustomer ._addressCustomerRef , qAddress );
70
+ return qdslTemplate .query (
71
+ allCustomersQuery ,
72
72
new CustomerListExtractor (),
73
73
customerAddressProjection );
74
74
}
75
75
76
+ @ Override
77
+ @ Transactional (readOnly = true )
78
+ public Customer findByEmailAddress (EmailAddress emailAddress ) {
79
+ if (emailAddress == null ) {
80
+ return null ;
81
+ }
82
+ return findOne (qCustomer .emailAddress .eq (emailAddress .toString ()));
83
+ }
84
+
85
+ private Customer findOne (Predicate predicate ) {
86
+ SQLQuery oneCustomerQuery = qdslTemplate .newSqlQuery ()
87
+ .from (qCustomer )
88
+ .leftJoin (qCustomer ._addressCustomerRef , qAddress )
89
+ .where (predicate );
90
+ return qdslTemplate .queryForObject (
91
+ oneCustomerQuery ,
92
+ new CustomerExtractor (),
93
+ customerAddressProjection );
94
+ }
95
+
76
96
@ Override
77
97
public void save (final Customer customer ) {
78
98
if (customer .getId () == null ) {
79
- Long generatedKey = template .insertWithKey (qCustomer , new SqlInsertWithKeyCallback <Long >() {
99
+ Long generatedKey = qdslTemplate .insertWithKey (qCustomer , new SqlInsertWithKeyCallback <Long >() {
80
100
@ Override
81
101
public Long doInSqlInsertWithKeyClause (SQLInsertClause insert ) throws SQLException {
82
102
return insert .columns (qCustomer .firstName , qCustomer .lastName , qCustomer .emailAddress )
@@ -88,15 +108,15 @@ public Long doInSqlInsertWithKeyClause(SQLInsertClause insert) throws SQLExcepti
88
108
customer .setId (generatedKey );
89
109
}
90
110
else {
91
- template .update (qCustomer , new SqlUpdateCallback () {
111
+ qdslTemplate .update (qCustomer , new SqlUpdateCallback () {
92
112
@ Override
93
113
public long doInSqlUpdateClause (SQLUpdateClause update ) {
94
114
return update .where (qCustomer .id .eq (customer .getId ()))
95
- .set (qCustomer .firstName , customer .getFirstName ())
96
- .set (qCustomer .lastName , customer .getLastName ())
97
- .set (qCustomer .emailAddress ,
98
- customer .getEmailAddress () == null ? null : customer .getEmailAddress ().toString ())
99
- .execute ();
115
+ .set (qCustomer .firstName , customer .getFirstName ())
116
+ .set (qCustomer .lastName , customer .getLastName ())
117
+ .set (qCustomer .emailAddress ,
118
+ customer .getEmailAddress () == null ? null : customer .getEmailAddress ().toString ())
119
+ .execute ();
100
120
}
101
121
});
102
122
}
@@ -109,7 +129,7 @@ public long doInSqlUpdateClause(SQLUpdateClause update) {
109
129
}
110
130
// first delete any potentially removed addresses
111
131
if (ids .size () > 0 ) {
112
- template .delete (qAddress , new SqlDeleteCallback () {
132
+ qdslTemplate .delete (qAddress , new SqlDeleteCallback () {
113
133
@ Override
114
134
public long doInSqlDeleteClause (SQLDeleteClause delete ) {
115
135
return delete .where (qAddress .customerId .eq (customer .getId ())
@@ -120,7 +140,7 @@ public long doInSqlDeleteClause(SQLDeleteClause delete) {
120
140
// then update existing ones and add new ones
121
141
for (final Address a : customer .getAddresses ()) {
122
142
if (a .getId () != null ) {
123
- template .update (qAddress , new SqlUpdateCallback () {
143
+ qdslTemplate .update (qAddress , new SqlUpdateCallback () {
124
144
@ Override
125
145
public long doInSqlUpdateClause (SQLUpdateClause update ) {
126
146
return update .where (qAddress .id .eq (a .getId ()))
@@ -133,7 +153,7 @@ public long doInSqlUpdateClause(SQLUpdateClause update) {
133
153
});
134
154
}
135
155
else {
136
- template .insert (qAddress , new SqlInsertCallback () {
156
+ qdslTemplate .insert (qAddress , new SqlInsertCallback () {
137
157
@ Override
138
158
public long doInSqlInsertClause (SQLInsertClause insert ) {
139
159
return insert .columns (qAddress .customerId , qAddress .street , qAddress .city , qAddress .country )
@@ -147,24 +167,22 @@ public long doInSqlInsertClause(SQLInsertClause insert) {
147
167
148
168
@ Override
149
169
public void delete (final Customer customer ) {
150
- template .delete (qAddress , new SqlDeleteCallback () {
170
+ qdslTemplate .delete (qAddress , new SqlDeleteCallback () {
151
171
@ Override
152
172
public long doInSqlDeleteClause (SQLDeleteClause delete ) {
153
173
return delete .where (qAddress .customerId .eq (customer .getId ())).execute ();
154
174
}
155
175
});
156
- template .delete (qCustomer , new SqlDeleteCallback () {
176
+ qdslTemplate .delete (qCustomer , new SqlDeleteCallback () {
157
177
@ Override
158
178
public long doInSqlDeleteClause (SQLDeleteClause delete ) {
159
179
return delete .where (qCustomer .id .eq (customer .getId ())).execute ();
160
180
}
161
181
});
162
182
}
163
183
164
- @ Override
165
- @ Transactional (readOnly = true )
166
- public Customer findByEmailAddress (EmailAddress emailAddress ) {
167
- return null ;
184
+ private static String columnLabel (Path <?> path ) {
185
+ return path .toString ();
168
186
}
169
187
170
188
private static class CustomerListExtractor extends OneToManyResultSetExtractor <Customer , Address , Integer > {
@@ -183,14 +201,14 @@ public CustomerListExtractor(ExpectedResults expectedResults) {
183
201
184
202
@ Override
185
203
protected Integer mapPrimaryKey (ResultSet rs ) throws SQLException {
186
- return rs .getInt (qCustomer .id . toString ( ));
204
+ return rs .getInt (columnLabel ( qCustomer .id ));
187
205
}
188
206
189
207
@ Override
190
208
protected Integer mapForeignKey (ResultSet rs ) throws SQLException {
191
- String columnName = qAddress .addressCustomerRef .getLocalColumns ().get (0 ). toString ( );
192
- if (rs .getObject (columnName ) != null ) {
193
- return rs .getInt (columnName );
209
+ String fkPath = columnLabel ( qAddress .addressCustomerRef .getLocalColumns ().get (0 ));
210
+ if (rs .getObject (fkPath ) != null ) {
211
+ return rs .getInt (fkPath );
194
212
}
195
213
else {
196
214
return null ;
@@ -222,11 +240,11 @@ private static class CustomerMapper implements RowMapper<Customer> {
222
240
@ Override
223
241
public Customer mapRow (ResultSet rs , int rowNum ) throws SQLException {
224
242
Customer c = new Customer ();
225
- c .setId (rs .getLong (qCustomer .id . toString ( )));
226
- c .setFirstName (rs .getString (qCustomer .firstName . toString ( )));
227
- c .setLastName (rs .getString (qCustomer .lastName . toString ( )));
228
- if (rs .getString (qCustomer .emailAddress . toString ( )) != null ) {
229
- c .setEmailAddress (new EmailAddress (rs .getString (qCustomer .emailAddress . toString ( ))));
243
+ c .setId (rs .getLong (columnLabel ( qCustomer .id )));
244
+ c .setFirstName (rs .getString (columnLabel ( qCustomer .firstName )));
245
+ c .setLastName (rs .getString (columnLabel ( qCustomer .lastName )));
246
+ if (rs .getString (columnLabel ( qCustomer .emailAddress )) != null ) {
247
+ c .setEmailAddress (new EmailAddress (rs .getString (columnLabel ( qCustomer .emailAddress ))));
230
248
}
231
249
return c ;
232
250
}
@@ -238,11 +256,11 @@ private static class AddressMapper implements RowMapper<Address> {
238
256
239
257
@ Override
240
258
public Address mapRow (ResultSet rs , int rowNum ) throws SQLException {
241
- String street = rs .getString (qAddress .street . toString ( ));
242
- String city = rs .getString (qAddress .city . toString ( ));
243
- String country = rs .getString (qAddress .country . toString ( ));
259
+ String street = rs .getString (columnLabel ( qAddress .street ));
260
+ String city = rs .getString (columnLabel ( qAddress .city ));
261
+ String country = rs .getString (columnLabel ( qAddress .country ));
244
262
Address a = new Address (street , city , country );
245
- a .setId (rs .getLong (qAddress .id . toString ( )));
263
+ a .setId (rs .getLong (columnLabel ( qAddress .id )));
246
264
return a ;
247
265
}
248
266
}
0 commit comments