|
26 | 26 | import java.util.LinkedHashMap;
|
27 | 27 | import java.util.List;
|
28 | 28 | import java.util.Map;
|
| 29 | +import java.util.OptionalLong; |
29 | 30 | import java.util.Set;
|
30 | 31 | import java.util.function.BiFunction;
|
31 | 32 | import java.util.function.Function;
|
|
43 | 44 | import org.springframework.data.r2dbc.dialect.BindMarkers;
|
44 | 45 | import org.springframework.data.r2dbc.dialect.BindMarkersFactory;
|
45 | 46 | import org.springframework.data.r2dbc.dialect.Dialect;
|
46 |
| -import org.springframework.data.r2dbc.dialect.LimitClause; |
47 |
| -import org.springframework.data.r2dbc.dialect.LimitClause.Position; |
48 | 47 | import org.springframework.data.r2dbc.function.convert.EntityRowMapper;
|
49 | 48 | import org.springframework.data.r2dbc.function.convert.R2dbcCustomConversions;
|
50 | 49 | import org.springframework.data.r2dbc.function.convert.SettableValue;
|
| 50 | +import org.springframework.data.r2dbc.support.StatementRenderUtil; |
51 | 51 | import org.springframework.data.relational.core.conversion.BasicRelationalConverter;
|
52 | 52 | import org.springframework.data.relational.core.conversion.RelationalConverter;
|
53 | 53 | import org.springframework.data.relational.core.mapping.RelationalMappingContext;
|
54 | 54 | import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
|
55 | 55 | import org.springframework.data.relational.core.mapping.RelationalPersistentProperty;
|
| 56 | +import org.springframework.data.relational.core.sql.Expression; |
| 57 | +import org.springframework.data.relational.core.sql.OrderByField; |
| 58 | +import org.springframework.data.relational.core.sql.SelectBuilder.SelectFromAndOrderBy; |
| 59 | +import org.springframework.data.relational.core.sql.StatementBuilder; |
| 60 | +import org.springframework.data.relational.core.sql.Table; |
56 | 61 | import org.springframework.data.util.TypeInformation;
|
57 | 62 | import org.springframework.lang.Nullable;
|
58 | 63 | import org.springframework.util.Assert;
|
@@ -312,94 +317,47 @@ public BindableOperation insertAndReturnGeneratedKeys(String table, Set<String>
|
312 | 317 | * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#select(java.lang.String, java.util.Set, org.springframework.data.domain.Sort, org.springframework.data.domain.Pageable)
|
313 | 318 | */
|
314 | 319 | @Override
|
315 |
| - public QueryOperation select(String table, Set<String> columns, Sort sort, Pageable page) { |
| 320 | + public String select(String table, Set<String> columns, Sort sort, Pageable page) { |
316 | 321 |
|
317 |
| - StringBuilder selectBuilder = new StringBuilder(); |
| 322 | + Table tableToUse = Table.create(table); |
318 | 323 |
|
319 |
| - selectBuilder.append("SELECT").append(' ') // |
320 |
| - .append(StringUtils.collectionToDelimitedString(columns, ", ")).append(' ') // |
321 |
| - .append("FROM").append(' ').append(table); |
| 324 | + Collection<? extends Expression> selectList; |
322 | 325 |
|
323 |
| - if (sort.isSorted()) { |
324 |
| - selectBuilder.append(' ').append("ORDER BY").append(' ').append(getSortClause(sort)); |
| 326 | + if (columns.isEmpty()) { |
| 327 | + selectList = Collections.singletonList(tableToUse.asterisk()); |
| 328 | + } else { |
| 329 | + selectList = tableToUse.columns(columns); |
325 | 330 | }
|
326 | 331 |
|
327 |
| - if (page.isPaged()) { |
328 |
| - |
329 |
| - LimitClause limitClause = dialect.limit(); |
330 |
| - |
331 |
| - if (limitClause.getClausePosition() == Position.END) { |
332 |
| - |
333 |
| - selectBuilder.append(' ').append(limitClause.getClause(page.getPageSize(), page.getOffset())); |
334 |
| - } |
335 |
| - } |
336 |
| - |
337 |
| - return selectBuilder::toString; |
338 |
| - } |
339 |
| - |
340 |
| - private StringBuilder getSortClause(Sort sort) { |
341 |
| - |
342 |
| - StringBuilder sortClause = new StringBuilder(); |
| 332 | + SelectFromAndOrderBy selectBuilder = StatementBuilder.select(selectList).from(table) |
| 333 | + .orderBy(createOrderByFields(tableToUse, sort)); |
| 334 | + OptionalLong limit = OptionalLong.empty(); |
| 335 | + OptionalLong offset = OptionalLong.empty(); |
343 | 336 |
|
344 |
| - for (Order order : sort) { |
345 |
| - |
346 |
| - if (sortClause.length() != 0) { |
347 |
| - sortClause.append(',').append(' '); |
348 |
| - } |
349 |
| - |
350 |
| - sortClause.append(order.getProperty()).append(' ').append(order.getDirection().isAscending() ? "ASC" : "DESC"); |
| 337 | + if (page.isPaged()) { |
| 338 | + limit = OptionalLong.of(page.getPageSize()); |
| 339 | + offset = OptionalLong.of(page.getOffset()); |
351 | 340 | }
|
352 |
| - return sortClause; |
353 |
| - } |
354 |
| - |
355 |
| - /* |
356 |
| - * (non-Javadoc) |
357 |
| - * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#selectById(java.lang.String, java.util.Set, java.lang.String) |
358 |
| - */ |
359 |
| - @Override |
360 |
| - public BindIdOperation selectById(String table, Set<String> columns, String idColumn) { |
361 |
| - |
362 |
| - return new DefaultBindIdOperation(dialect.getBindMarkersFactory().create(), marker -> { |
363 | 341 |
|
364 |
| - String columnClause = StringUtils.collectionToDelimitedString(columns, ", "); |
365 |
| - |
366 |
| - return String.format("SELECT %s FROM %s WHERE %s = %s", columnClause, table, idColumn, marker.getPlaceholder()); |
367 |
| - }); |
| 342 | + return StatementRenderUtil.render(selectBuilder.build(), limit, offset, this.dialect); |
368 | 343 | }
|
369 | 344 |
|
370 |
| - /* |
371 |
| - * (non-Javadoc) |
372 |
| - * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#selectById(java.lang.String, java.util.Set, java.lang.String, int) |
373 |
| - */ |
374 |
| - @Override |
375 |
| - public BindIdOperation selectById(String table, Set<String> columns, String idColumn, int limit) { |
376 |
| - |
377 |
| - LimitClause limitClause = dialect.limit(); |
| 345 | + private Collection<? extends OrderByField> createOrderByFields(Table table, Sort sortToUse) { |
378 | 346 |
|
379 |
| - return new DefaultBindIdOperation(dialect.getBindMarkersFactory().create(), marker -> { |
| 347 | + List<OrderByField> fields = new ArrayList<>(); |
380 | 348 |
|
381 |
| - String columnClause = StringUtils.collectionToDelimitedString(columns, ", "); |
| 349 | + for (Order order : sortToUse) { |
382 | 350 |
|
383 |
| - if (limitClause.getClausePosition() == Position.END) { |
| 351 | + OrderByField orderByField = OrderByField.from(table.column(order.getProperty())); |
384 | 352 |
|
385 |
| - return String.format("SELECT %s FROM %s WHERE %s = %s ORDER BY %s %s", columnClause, table, idColumn, |
386 |
| - marker.getPlaceholder(), idColumn, limitClause.getClause(limit)); |
| 353 | + if (order.getDirection() != null) { |
| 354 | + fields.add(order.isAscending() ? orderByField.asc() : orderByField.desc()); |
| 355 | + } else { |
| 356 | + fields.add(orderByField); |
387 | 357 | }
|
| 358 | + } |
388 | 359 |
|
389 |
| - throw new UnsupportedOperationException( |
390 |
| - String.format("Limit clause position %s not supported!", limitClause.getClausePosition())); |
391 |
| - }); |
392 |
| - } |
393 |
| - |
394 |
| - /* |
395 |
| - * (non-Javadoc) |
396 |
| - * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#selectByIdIn(java.lang.String, java.util.Set, java.lang.String) |
397 |
| - */ |
398 |
| - @Override |
399 |
| - public BindIdOperation selectByIdIn(String table, Set<String> columns, String idColumn) { |
400 |
| - |
401 |
| - String query = String.format("SELECT %s FROM %s", StringUtils.collectionToDelimitedString(columns, ", "), table); |
402 |
| - return new DefaultBindIdIn(dialect.getBindMarkersFactory().create(), query, idColumn); |
| 360 | + return fields; |
403 | 361 | }
|
404 | 362 |
|
405 | 363 | /*
|
|
0 commit comments