1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.batch.item.database.support;
18
19 import java.util.ArrayList;
20 import java.util.LinkedHashMap;
21 import java.util.List;
22 import java.util.Map;
23
24 import javax.sql.DataSource;
25
26 import org.springframework.batch.item.database.JdbcParameterUtils;
27 import org.springframework.batch.item.database.Order;
28 import org.springframework.batch.item.database.PagingQueryProvider;
29 import org.springframework.dao.InvalidDataAccessApiUsageException;
30 import org.springframework.util.Assert;
31 import org.springframework.util.StringUtils;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvider {
54
55 private String selectClause;
56
57 private String fromClause;
58
59 private String whereClause;
60
61 private Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
62
63 private String groupClause;
64
65 private int parameterCount;
66
67 private boolean usingNamedParameters;
68
69
70
71
72
73
74 public void setGroupClause(String groupClause) {
75 if (StringUtils.hasText(groupClause)) {
76 this.groupClause = removeKeyWord("group by", groupClause);
77 }
78 else {
79 this.groupClause = null;
80 }
81 }
82
83
84
85
86
87
88 public String getGroupClause() {
89 return this.groupClause;
90 }
91
92
93
94
95 public void setSelectClause(String selectClause) {
96 this.selectClause = removeKeyWord("select", selectClause);
97 }
98
99
100
101
102
103 protected String getSelectClause() {
104 return selectClause;
105 }
106
107
108
109
110 public void setFromClause(String fromClause) {
111 this.fromClause = removeKeyWord("from", fromClause);
112 }
113
114
115
116
117
118 protected String getFromClause() {
119 return fromClause;
120 }
121
122
123
124
125 public void setWhereClause(String whereClause) {
126 if (StringUtils.hasText(whereClause)) {
127 this.whereClause = removeKeyWord("where", whereClause);
128 }
129 else {
130 this.whereClause = null;
131 }
132 }
133
134
135
136
137
138 protected String getWhereClause() {
139 return whereClause;
140 }
141
142
143
144
145 public void setSortKeys(Map<String, Order> sortKeys) {
146 this.sortKeys = sortKeys;
147 }
148
149
150
151
152
153
154 @Override
155 public Map<String, Order> getSortKeys() {
156 return sortKeys;
157 }
158
159 @Override
160 public int getParameterCount() {
161 return parameterCount;
162 }
163
164 @Override
165 public boolean isUsingNamedParameters() {
166 return usingNamedParameters;
167 }
168
169
170
171
172
173
174
175 @Override
176 public String getSortKeyPlaceHolder(String keyName) {
177 return usingNamedParameters ? ":_" + keyName : "?";
178 }
179
180
181
182
183
184 @Override
185 public void init(DataSource dataSource) throws Exception {
186 Assert.notNull(dataSource);
187 Assert.hasLength(selectClause, "selectClause must be specified");
188 Assert.hasLength(fromClause, "fromClause must be specified");
189 Assert.notEmpty(sortKeys, "sortKey must be specified");
190 StringBuilder sql = new StringBuilder();
191 sql.append("SELECT ").append(selectClause);
192 sql.append(" FROM ").append(fromClause);
193 if (whereClause != null) {
194 sql.append(" WHERE ").append(whereClause);
195 }
196 if(groupClause != null) {
197 sql.append(" GROUP BY ").append(groupClause);
198 }
199 List<String> namedParameters = new ArrayList<String>();
200 parameterCount = JdbcParameterUtils.countParameterPlaceholders(sql.toString(), namedParameters);
201 if (namedParameters.size() > 0) {
202 if (parameterCount != namedParameters.size()) {
203 throw new InvalidDataAccessApiUsageException(
204 "You can't use both named parameters and classic \"?\" placeholders: " + sql);
205 }
206 usingNamedParameters = true;
207 }
208 }
209
210
211
212
213
214
215
216
217 @Override
218 public abstract String generateFirstPageQuery(int pageSize);
219
220
221
222
223
224
225
226
227 @Override
228 public abstract String generateRemainingPagesQuery(int pageSize);
229
230
231
232
233
234
235
236
237
238 @Override
239 public abstract String generateJumpToItemQuery(int itemIndex, int pageSize);
240
241 private String removeKeyWord(String keyWord, String clause) {
242 String temp = clause.trim();
243 String keyWordString = keyWord + " ";
244 if (temp.toLowerCase().startsWith(keyWordString) && temp.length() > keyWordString.length()) {
245 return temp.substring(keyWordString.length());
246 }
247 else {
248 return temp;
249 }
250 }
251
252 }