Browse Source

Add public factory method to SubselectExpression.

This allows using Select instances as Expression where this isn't yet anticipated.

Closes #1831
pull/1838/head
Jens Schauder 1 year ago
parent
commit
11384ab91f
No known key found for this signature in database
GPG Key ID: 74F6C554AE971567
  1. 10
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SubselectExpression.java
  2. 25
      spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java

10
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/SubselectExpression.java

@ -27,4 +27,14 @@ public class SubselectExpression extends Subselect implements Expression {
super(subselect); super(subselect);
} }
/**
* Wraps a Select in a {@link SubselectExpression}, for using it as an expression in function calls or similar.
*
* @author Jens Schauder
* @since 3.4
*/
public static Expression of(Select subselect) {
return new SubselectExpression(subselect);
}
} }

25
spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java

@ -24,6 +24,8 @@ import org.springframework.data.relational.core.dialect.RenderContextFactory;
import org.springframework.data.relational.core.sql.*; import org.springframework.data.relational.core.sql.*;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.List;
/** /**
* Unit tests for {@link SqlRenderer}. * Unit tests for {@link SqlRenderer}.
* *
@ -413,6 +415,29 @@ class SelectRendererUnitTests {
.isEqualTo("SELECT foo.bar FROM foo WHERE foo.bar IN (SELECT floo.bah FROM floo)"); .isEqualTo("SELECT foo.bar FROM foo WHERE foo.bar IN (SELECT floo.bah FROM floo)");
} }
@Test // GH-1831
void shouldRenderSimpleFunctionWithSubselect() {
Table foo = SQL.table("foo");
Table floo = SQL.table("floo");
Column bah = floo.column("bah");
Select subselect = Select.builder().select(bah).from(floo).build();
SimpleFunction func = SimpleFunction.create("func", List.of(SubselectExpression.of(subselect)));
Select select = Select.builder() //
.select(func.as("alias")) //
.from(foo) //
.where(Conditions.isEqual(func, SQL.literalOf(23))) //
.build();
assertThat(SqlRenderer.toString(select))
.isEqualTo("SELECT func(SELECT floo.bah FROM floo) AS alias FROM foo WHERE func(SELECT floo.bah FROM floo) = 23");
}
@Test // DATAJDBC-309 @Test // DATAJDBC-309
void shouldConsiderNamingStrategy() { void shouldConsiderNamingStrategy() {

Loading…
Cancel
Save