From 2326e234cdec718cf5c9d5e6e0a1d6d67b868c8c Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Mon, 20 Jan 2025 09:55:57 +0100 Subject: [PATCH] Consider query columns as property names. Query columns now get checked against property names. If such a property name is found, the property is used. Otherwise the column is considered a literal column and used as is in the SQL generation. Original pull request #1967 See #1803 --- .../data/jdbc/core/convert/SqlGenerator.java | 39 +++++++++++++------ .../core/convert/SqlGeneratorUnitTests.java | 2 +- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java index b834b927e6..357d921131 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlGenerator.java @@ -541,24 +541,25 @@ private Projection getProjection(Collection keyColumns, Query que if (!CollectionUtils.isEmpty(query.getColumns())) { for (SqlIdentifier columnName : query.getColumns()) { - columns.add(Column.create(columnName, table)); + + String columnNameString = columnName.getReference(); + RelationalPersistentProperty property = entity.getPersistentProperty(columnNameString); + if (property != null) { + + AggregatePath aggregatePath = mappingContext.getAggregatePath( + mappingContext.getPersistentPropertyPath(columnNameString, entity.getTypeInformation())); + gatherColumn(aggregatePath, joins, columns); + } else { + columns.add(Column.create(columnName, table)); + } } } else { for (PersistentPropertyPath path : mappingContext .findPersistentPropertyPaths(entity.getType(), p -> true)) { - AggregatePath extPath = mappingContext.getAggregatePath(path); + AggregatePath aggregatePath = mappingContext.getAggregatePath(path); - // add a join if necessary - Join join = getJoin(extPath); - if (join != null) { - joins.add(join); - } - - Column column = getColumn(extPath); - if (column != null) { - columns.add(column); - } + gatherColumn(aggregatePath, joins, columns); } } @@ -569,6 +570,20 @@ private Projection getProjection(Collection keyColumns, Query que return new Projection(columns, joins); } + private void gatherColumn(AggregatePath aggregatePath, Set joins, Set columns) { + + // add a join if necessary + Join join = getJoin(aggregatePath); + if (join != null) { + joins.add(join); + } + + Column column = getColumn(aggregatePath); + if (column != null) { + columns.add(column); + } + } + /** * Projection including its source joins. * diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java index 199add84c8..69286031cb 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlGeneratorUnitTests.java @@ -367,7 +367,7 @@ void selectByQueryWithColumnLimit() { String sql = sqlGenerator.selectByQuery(query, new MapSqlParameterSource()); assertThat(sql).contains( // - "SELECT dummy_entity.id1, dummy_entity.alpha, dummy_entity.beta, dummy_entity.gamma", // + "SELECT dummy_entity.id1 AS id1, dummy_entity.alpha, dummy_entity.beta, dummy_entity.gamma", // "FROM dummy_entity" // ); }