diff --git a/pom.xml b/pom.xml index eeaa0b9e93..d6c5d3cd67 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-968-fully-qualified-order-by-SNAPSHOT pom Spring Data Relational Parent diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml index 03d6a5c2a0..01c6ed1dee 100644 --- a/spring-data-jdbc-distribution/pom.xml +++ b/spring-data-jdbc-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-968-fully-qualified-order-by-SNAPSHOT ../pom.xml diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml index af9ad0904e..cc555ac151 100644 --- a/spring-data-jdbc/pom.xml +++ b/spring-data-jdbc/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-jdbc - 2.3.0-SNAPSHOT + 2.3.0-968-fully-qualified-order-by-SNAPSHOT Spring Data JDBC Spring Data module for JDBC repositories. @@ -15,7 +15,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-968-fully-qualified-order-by-SNAPSHOT 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 d6e89bc745..fa7250b3e0 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 @@ -218,7 +218,7 @@ public void findAllSortedBySingleField() { "FROM dummy_entity ", // "LEFT OUTER JOIN referenced_entity ref ON ref.dummy_entity = dummy_entity.id1", // "LEFT OUTER JOIN second_level_referenced_entity ref_further ON ref_further.referenced_entity = ref.x_l1id", // - "ORDER BY x_name ASC"); + "ORDER BY dummy_entity.x_name ASC"); } @Test // DATAJDBC-101 @@ -238,7 +238,7 @@ public void findAllSortedByMultipleFields() { "FROM dummy_entity ", // "LEFT OUTER JOIN referenced_entity ref ON ref.dummy_entity = dummy_entity.id1", // "LEFT OUTER JOIN second_level_referenced_entity ref_further ON ref_further.referenced_entity = ref.x_l1id", // - "ORDER BY x_name DESC", // + "ORDER BY dummy_entity.x_name DESC", // "x_other ASC"); } @@ -286,7 +286,7 @@ public void findAllPagedAndSorted() { "FROM dummy_entity ", // "LEFT OUTER JOIN referenced_entity ref ON ref.dummy_entity = dummy_entity.id1", // "LEFT OUTER JOIN second_level_referenced_entity ref_further ON ref_further.referenced_entity = ref.x_l1id", // - "ORDER BY x_name ASC", // + "ORDER BY dummy_entity.x_name ASC", // "OFFSET 30", // "LIMIT 10"); } @@ -371,7 +371,8 @@ public void findAllByPropertyWithKeyOrdered() { + "FROM dummy_entity " // + "LEFT OUTER JOIN referenced_entity ref ON ref.dummy_entity = dummy_entity.id1 " // + "LEFT OUTER JOIN second_level_referenced_entity ref_further ON ref_further.referenced_entity = ref.x_l1id " // - + "WHERE dummy_entity.backref = :backref " + "ORDER BY key-column"); + + "WHERE dummy_entity.backref = :backref " // + + "ORDER BY dummy_entity.key-column"); } @Test // DATAJDBC-219 @@ -493,7 +494,7 @@ public void readOnlyPropertyIncludedIntoQuery_when_generateFindAllByPropertySql( + "entity_with_read_only_property.key-column AS key-column " // + "FROM entity_with_read_only_property " // + "WHERE entity_with_read_only_property.backref = :backref " // - + "ORDER BY key-column" // + + "ORDER BY entity_with_read_only_property.key-column" // ); } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/PartTreeJdbcQueryUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/PartTreeJdbcQueryUnitTests.java index 1b963129f2..8bff44d21e 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/PartTreeJdbcQueryUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/PartTreeJdbcQueryUnitTests.java @@ -445,7 +445,7 @@ public void createsQueryToFindAllEntitiesByIntegerAttributeWithDescendingOrderin ParametrizedQuery query = jdbcQuery.createQuery(accessor, returnedType); assertThat(query.getQuery()) - .isEqualTo(BASE_SELECT + " WHERE " + TABLE + ".\"AGE\" = :age ORDER BY \"LAST_NAME\" DESC"); + .isEqualTo(BASE_SELECT + " WHERE " + TABLE + ".\"AGE\" = :age ORDER BY \"users\".\"LAST_NAME\" DESC"); } @Test // DATAJDBC-318 @@ -456,7 +456,7 @@ public void createsQueryToFindAllEntitiesByIntegerAttributeWithAscendingOrdering ParametrizedQuery query = jdbcQuery.createQuery(accessor, returnedType); assertThat(query.getQuery()) - .isEqualTo(BASE_SELECT + " WHERE " + TABLE + ".\"AGE\" = :age ORDER BY \"LAST_NAME\" ASC"); + .isEqualTo(BASE_SELECT + " WHERE " + TABLE + ".\"AGE\" = :age ORDER BY \"users\".\"LAST_NAME\" ASC"); } @Test // DATAJDBC-318 diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml index 4e42a006ec..775601921a 100644 --- a/spring-data-relational/pom.xml +++ b/spring-data-relational/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-relational - 2.3.0-SNAPSHOT + 2.3.0-968-fully-qualified-order-by-SNAPSHOT Spring Data Relational Spring Data Relational support @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 2.3.0-SNAPSHOT + 2.3.0-968-fully-qualified-order-by-SNAPSHOT diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java index bee2c00425..a918231dd2 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java @@ -77,7 +77,7 @@ Delegation leaveMatched(OrderByField segment) { Delegation leaveNested(Visitable segment) { if (segment instanceof Column) { - builder.append(NameRenderer.reference(context, (Column) segment)); + builder.append(NameRenderer.fullyQualifiedReference(context, (Column) segment)); } return super.leaveNested(segment); diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/SqlServerDialectRenderingUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/SqlServerDialectRenderingUnitTests.java index d6a0764d8a..2c2f865c09 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/SqlServerDialectRenderingUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/SqlServerDialectRenderingUnitTests.java @@ -112,7 +112,7 @@ public void shouldRenderSelectWithLimitOffsetAndOrderBy() { String sql = SqlRenderer.create(factory.createRenderContext()).render(select); - assertThat(sql).isEqualTo("SELECT foo.* FROM foo ORDER BY column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY"); + assertThat(sql).isEqualTo("SELECT foo.* FROM foo ORDER BY foo.column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY"); } @Test // DATAJDBC-498 @@ -177,7 +177,7 @@ public void shouldRenderSelectWithLimitOffsetAndOrderByWithLockWrite() { String sql = SqlRenderer.create(factory.createRenderContext()).render(select); - assertThat(sql).isEqualTo("SELECT foo.* FROM foo WITH (UPDLOCK, ROWLOCK) ORDER BY column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY"); + assertThat(sql).isEqualTo("SELECT foo.* FROM foo WITH (UPDLOCK, ROWLOCK) ORDER BY foo.column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY"); } @Test // DATAJDBC-498 @@ -190,6 +190,6 @@ public void shouldRenderSelectWithLimitOffsetAndOrderByWithLockRead() { String sql = SqlRenderer.create(factory.createRenderContext()).render(select); - assertThat(sql).isEqualTo("SELECT foo.* FROM foo WITH (HOLDLOCK, ROWLOCK) ORDER BY column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY"); + assertThat(sql).isEqualTo("SELECT foo.* FROM foo WITH (HOLDLOCK, ROWLOCK) ORDER BY foo.column_1 OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY"); } } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/NameRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/NameRendererUnitTests.java index c87d795310..77c9bceafc 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/NameRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/NameRendererUnitTests.java @@ -49,14 +49,4 @@ void fullyQualifiedReference() { assertThat(rendered).isEqualTo("tab_alias.col_alias"); } - - @Test // GH-1003 - void fullyQualifiedUnaliasedReference() { - - Column column = Column.aliased("col", Table.aliased("table", "tab_alias"), "col_alias"); - - CharSequence rendered = NameRenderer.fullyQualifiedUnaliasedReference(context, column); - - assertThat(rendered).isEqualTo("tab_alias.col"); - } } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitorUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitorUnitTests.java index 3cf9b13d85..878f72bda3 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitorUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitorUnitTests.java @@ -32,7 +32,7 @@ public class OrderByClauseVisitorUnitTests { @Test // DATAJDBC-309 - public void shouldRenderOrderByName() { + public void shouldRenderOrderByAlias() { Table employee = SQL.table("employee").as("emp"); Column column = employee.column("name").as("emp_name"); @@ -42,9 +42,8 @@ public void shouldRenderOrderByName() { OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.asIs())); select.visit(visitor); - assertThat(visitor.getRenderedPart().toString()).isEqualTo("emp_name ASC"); + assertThat(visitor.getRenderedPart().toString()).isEqualTo("emp.emp_name ASC"); } - @Test // DATAJDBC-309 public void shouldApplyNamingStrategy() { @@ -56,6 +55,37 @@ public void shouldApplyNamingStrategy() { OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.toUpper())); select.visit(visitor); - assertThat(visitor.getRenderedPart().toString()).isEqualTo("EMP_NAME ASC"); + assertThat(visitor.getRenderedPart().toString()).isEqualTo("EMP.EMP_NAME ASC"); + } + + @Test // GH-968 + public void shouldRenderOrderByFullyQualifiedName() { + + Table employee = SQL.table("employee"); + Column column = employee.column("name"); + + Select select = Select.builder().select(column).from(employee).orderBy(OrderByField.from(column).asc()).build(); + + OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.asIs())); + select.visit(visitor); + + assertThat(visitor.getRenderedPart().toString()).isEqualTo("employee.name ASC"); } + + @Test // GH-968 + public void shouldRenderOrderByFullyQualifiedNameWithTableAlias() { + + Table employee = SQL.table("employee").as("emp"); + Column column = employee.column("name"); + + Select select = Select.builder().select(column).from(employee).orderBy(OrderByField.from(column).asc()).build(); + + OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.asIs())); + select.visit(visitor); + + assertThat(visitor.getRenderedPart().toString()).isEqualTo("emp.name ASC"); + } + + + } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java index 7a223c1564..442f1d0442 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java @@ -266,7 +266,7 @@ void shouldRenderOrderByName() { Select select = Select.builder().select(column).from(employee).orderBy(OrderByField.from(column).asc()).build(); assertThat(SqlRenderer.toString(select)) - .isEqualTo("SELECT emp.name AS emp_name FROM employee emp ORDER BY emp_name ASC"); + .isEqualTo("SELECT emp.name AS emp_name FROM employee emp ORDER BY emp.emp_name ASC"); } @Test // DATAJDBC-309 @@ -467,4 +467,26 @@ void shouldRenderCast() { final String rendered = SqlRenderer.toString(select); assertThat(rendered).isEqualTo("SELECT CAST(User.name AS VARCHAR2) FROM User"); } + + @Test // GH-968 + void rendersFullyQualifiedNamesInOrderBy() { + + Table tableA = SQL.table("tableA"); + Column tableAName = tableA.column("name"); + Column tableAId = tableA.column("id"); + + Table tableB = SQL.table("tableB"); + Column tableBId = tableB.column("id"); + Column tableBName = tableB.column("name"); + + Select select = StatementBuilder.select(Expressions.asterisk()) // + .from(tableA) // + .join(tableB).on(tableAId.isEqualTo(tableBId)) // + .orderBy(tableAName, tableBName) // + .build(); + + final String rendered = SqlRenderer.toString(select); + assertThat(rendered) + .isEqualTo("SELECT * FROM tableA JOIN tableB ON tableA.id = tableB.id ORDER BY tableA.name, tableB.name"); + } }