diff --git a/CHANGELOG.md b/CHANGELOG.md index 49ae77c14..3783d2b89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=miles ### Added - Changed the public SQLBuilder API to accept Collection instead of List for in conditions and batch record inserts. This should have no impact on existing code, but allow for some future flexibility -- Added the ability have have table catalog and/or schema calculated at query runtime. This is useful for situations where there are different database schemas for different environments, or in some sharding situations +- Added the ability have have table catalog and/or schema calculated at query runtime. This is useful for situations where there are different database schemas for different environments, or in some sharding situations +- Added the ability to call a builder method on any intermediate object in a select statement and receive a fully rendered statement. This makes it easier to build very dynamic queries ## Release 1.1.1 - April 7, 2019 diff --git a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java index b1465faf4..c18474c25 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; +import java.util.function.Supplier; import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; @@ -49,6 +51,7 @@ public class QueryExpressionDSL implements Buildable { private GroupByModel groupByModel; private JoinModel joinModel; private List joinSpecifications = new ArrayList<>(); + private Supplier buildDelegateMethod; private QueryExpressionDSL(FromGatherer fromGatherer) { connector = fromGatherer.connector; @@ -56,6 +59,7 @@ private QueryExpressionDSL(FromGatherer fromGatherer) { isDistinct = fromGatherer.isDistinct; selectDSL = Objects.requireNonNull(fromGatherer.selectDSL); table = Objects.requireNonNull(fromGatherer.table); + buildDelegateMethod = this::internalBuild; } private QueryExpressionDSL(FromGatherer fromGatherer, String tableAlias) { @@ -89,6 +93,10 @@ public QueryExpressionWhereBuilder where(BindableColumn column, Visitable @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalBuild() { selectDSL.addQueryExpression(buildModel()); return selectDSL.build(); } @@ -136,6 +144,7 @@ public GroupByFinisher groupBy(BasicColumn...columns) { } public SelectDSL orderBy(SortSpecification...columns) { + buildDelegateMethod = selectDSL::build; selectDSL.addQueryExpression(buildModel()); selectDSL.setOrderByModel(OrderByModel.of(columns)); return selectDSL; @@ -164,16 +173,19 @@ protected QueryExpressionModel buildModel() { } public SelectDSL.LimitFinisher limit(long limit) { + buildDelegateMethod = selectDSL::build; selectDSL.addQueryExpression(buildModel()); return selectDSL.limit(limit); } public SelectDSL.OffsetFirstFinisher offset(long offset) { + buildDelegateMethod = selectDSL::build; selectDSL.addQueryExpression(buildModel()); return selectDSL.offset(offset); } public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { + buildDelegateMethod = selectDSL::build; selectDSL.addQueryExpression(buildModel()); return selectDSL.fetchFirst(fetchFirstRows); } @@ -184,22 +196,29 @@ public static class FromGatherer { private SelectDSL selectDSL; private boolean isDistinct; private SqlTable table; + private Optional> priorQuery; public FromGatherer(Builder builder) { this.connector = builder.connector; this.selectList = Objects.requireNonNull(builder.selectList); this.selectDSL = Objects.requireNonNull(builder.selectDSL); this.isDistinct = builder.isDistinct; + this.priorQuery = Optional.ofNullable(builder.priorQuery); } public QueryExpressionDSL from(SqlTable table) { this.table = table; - return new QueryExpressionDSL<>(this); + return setPriorBuildDelegate(new QueryExpressionDSL<>(this)); } public QueryExpressionDSL from(SqlTable table, String tableAlias) { this.table = table; - return new QueryExpressionDSL<>(this, tableAlias); + return setPriorBuildDelegate(new QueryExpressionDSL<>(this, tableAlias)); + } + + private QueryExpressionDSL setPriorBuildDelegate(QueryExpressionDSL newQuery) { + priorQuery.ifPresent(pq -> pq.buildDelegateMethod = newQuery::build); + return newQuery; } public static class Builder { @@ -207,6 +226,7 @@ public static class Builder { private BasicColumn[] selectList; private SelectDSL selectDSL; private boolean isDistinct; + private QueryExpressionDSL priorQuery; public Builder withConnector(String connector) { this.connector = connector; @@ -228,6 +248,11 @@ public Builder isDistinct() { return this; } + public Builder withPriorQuery(QueryExpressionDSL priorQuery) { + this.priorQuery = priorQuery; + return this; + } + public FromGatherer build() { return new FromGatherer<>(this); } @@ -238,11 +263,13 @@ public class QueryExpressionWhereBuilder extends AbstractWhereDSL { private QueryExpressionWhereBuilder(BindableColumn column, VisitableCondition condition) { super(column, condition); + buildDelegateMethod = this::internalBuild; } private QueryExpressionWhereBuilder(BindableColumn column, VisitableCondition condition, SqlCriterion...subCriteria) { super(column, condition, subCriteria); + buildDelegateMethod = this::internalBuild; } public UnionBuilder union() { @@ -258,6 +285,7 @@ public UnionBuilder unionAll() { } public SelectDSL orderBy(SortSpecification...columns) { + buildDelegateMethod = selectDSL::build; whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); selectDSL.setOrderByModel(OrderByModel.of(columns)); @@ -272,18 +300,21 @@ public GroupByFinisher groupBy(BasicColumn...columns) { } public SelectDSL.LimitFinisher limit(long limit) { + buildDelegateMethod = selectDSL::build; whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.limit(limit); } public SelectDSL.OffsetFirstFinisher offset(long offset) { + buildDelegateMethod = selectDSL::build; whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.offset(offset); } public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { + buildDelegateMethod = selectDSL::build; whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.fetchFirst(fetchFirstRows); @@ -291,6 +322,10 @@ public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalBuild() { whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.build(); @@ -322,7 +357,6 @@ public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition joinCo } public class JoinSpecificationFinisher implements Buildable { - private SqlTable joinTable; private List joinCriteria = new ArrayList<>(); private JoinType joinType; @@ -338,6 +372,7 @@ public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn, .build(); joinCriteria.add(joinCriterion); + buildDelegateMethod = this::internalbuild; } public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn, @@ -352,6 +387,7 @@ public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn, this.joinCriteria.add(joinCriterion); this.joinCriteria.addAll(Arrays.asList(joinCriteria)); + buildDelegateMethod = this::internalbuild; } protected JoinSpecification buildJoinSpecification() { @@ -368,6 +404,10 @@ protected JoinModel buildJoinModel() { @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalbuild() { joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.build(); @@ -434,6 +474,7 @@ public JoinSpecificationStarter fullJoin(SqlTable joinTable, String tableAlias) } public SelectDSL orderBy(SortSpecification...columns) { + buildDelegateMethod = selectDSL::build; joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); selectDSL.setOrderByModel(OrderByModel.of(columns)); @@ -441,18 +482,21 @@ public SelectDSL orderBy(SortSpecification...columns) { } public SelectDSL.LimitFinisher limit(long limit) { + buildDelegateMethod = selectDSL::build; joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.limit(limit); } public SelectDSL.OffsetFirstFinisher offset(long offset) { + buildDelegateMethod = selectDSL::build; joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.offset(offset); } public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { + buildDelegateMethod = selectDSL::build; joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.fetchFirst(fetchFirstRows); @@ -460,25 +504,37 @@ public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { } public class GroupByFinisher implements Buildable { + public GroupByFinisher() { + buildDelegateMethod = this::internalBuild; + } + public SelectDSL orderBy(SortSpecification...columns) { + buildDelegateMethod = selectDSL::build; selectDSL.setOrderByModel(OrderByModel.of(columns)); return selectDSL; } @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalBuild() { return selectDSL.build(); } public SelectDSL.LimitFinisher limit(long limit) { + buildDelegateMethod = selectDSL::build; return selectDSL.limit(limit); } public SelectDSL.OffsetFirstFinisher offset(long offset) { + buildDelegateMethod = selectDSL::build; return selectDSL.offset(offset); } public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { + buildDelegateMethod = selectDSL::build; return selectDSL.fetchFirst(fetchFirstRows); } } @@ -495,6 +551,7 @@ public FromGatherer select(BasicColumn...selectList) { .withConnector(connector) .withSelectList(selectList) .withSelectDSL(selectDSL) + .withPriorQuery(QueryExpressionDSL.this) .build(); } @@ -504,6 +561,7 @@ public FromGatherer selectDistinct(BasicColumn...selectList) { .withSelectList(selectList) .withSelectDSL(selectDSL) .isDistinct() + .withPriorQuery(QueryExpressionDSL.this) .build(); } } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java index bbe2e4fd7..87bd1e736 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Objects; import java.util.function.Function; +import java.util.function.Supplier; import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; @@ -37,9 +38,11 @@ public class SelectDSL implements Buildable { private List queryExpressions = new ArrayList<>(); private OrderByModel orderByModel; private PagingModel pagingModel; + private Supplier buildDelegateMethod; private SelectDSL(Function adapterFunction) { this.adapterFunction = Objects.requireNonNull(adapterFunction); + buildDelegateMethod = this::internalBuild; } public static QueryExpressionDSL.FromGatherer select(BasicColumn...selectList) { @@ -95,6 +98,10 @@ public FetchFirstFinisher fetchFirst(long fetchFirstRows) { @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalBuild() { SelectModel selectModel = SelectModel.withQueryExpressions(queryExpressions) .withOrderByModel(orderByModel) .withPagingModel(pagingModel) @@ -107,6 +114,7 @@ public class LimitFinisher implements Buildable { public LimitFinisher(long limit) { this.limit = limit; + buildDelegateMethod = this::internalBuild; } public OffsetFinisher offset(long offset) { @@ -115,16 +123,21 @@ public OffsetFinisher offset(long offset) { @Override public R build() { - SelectDSL.this.pagingModel = new LimitAndOffsetPagingModel.Builder() + return buildDelegateMethod.get(); + } + + private R internalBuild() { + pagingModel = new LimitAndOffsetPagingModel.Builder() .withLimit(limit) .build(); - return SelectDSL.this.build(); + return SelectDSL.this.internalBuild(); } } public class OffsetFinisher implements Buildable { public OffsetFinisher(long limit, long offset) { - SelectDSL.this.pagingModel = new LimitAndOffsetPagingModel.Builder() + buildDelegateMethod = this::internalBuild; + pagingModel = new LimitAndOffsetPagingModel.Builder() .withLimit(limit) .withOffset(offset) .build(); @@ -132,7 +145,11 @@ public OffsetFinisher(long limit, long offset) { @Override public R build() { - return SelectDSL.this.build(); + return buildDelegateMethod.get(); + } + + private R internalBuild() { + return SelectDSL.this.internalBuild(); } } @@ -141,6 +158,7 @@ public class OffsetFirstFinisher implements Buildable { public OffsetFirstFinisher(long offset) { this.offset = offset; + buildDelegateMethod = this::internalBuild; } public FetchFirstFinisher fetchFirst(long fetchFirstRows) { @@ -149,22 +167,26 @@ public FetchFirstFinisher fetchFirst(long fetchFirstRows) { @Override public R build() { - SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder() + return buildDelegateMethod.get(); + } + + private R internalBuild() { + pagingModel = new FetchFirstPagingModel.Builder() .withOffset(offset) .build(); - return SelectDSL.this.build(); + return SelectDSL.this.internalBuild(); } } public class FetchFirstFinisher { public FetchFirstFinisher(long fetchFirstRows) { - SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder() + pagingModel = new FetchFirstPagingModel.Builder() .withFetchFirstRows(fetchFirstRows) .build(); } public FetchFirstFinisher(long offset, long fetchFirstRows) { - SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder() + pagingModel = new FetchFirstPagingModel.Builder() .withOffset(offset) .withFetchFirstRows(fetchFirstRows) .build(); @@ -176,9 +198,17 @@ public RowsOnlyFinisher rowsOnly() { } public class RowsOnlyFinisher implements Buildable { + public RowsOnlyFinisher() { + buildDelegateMethod = this::internalBuild; + } + @Override public R build() { - return SelectDSL.this.build(); + return buildDelegateMethod.get(); + } + + private R internalBuild() { + return SelectDSL.this.internalBuild(); } } } diff --git a/src/test/java/issues/gh100/FromGroupByTest.java b/src/test/java/issues/gh100/FromGroupByTest.java new file mode 100644 index 000000000..990f3b9db --- /dev/null +++ b/src/test/java/issues/gh100/FromGroupByTest.java @@ -0,0 +1,377 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import org.junit.jupiter.api.Test; +import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.QueryExpressionDSL; +import org.mybatis.dynamic.sql.select.SelectDSL; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; + +public class FromGroupByTest { + + @Test + public void testFromGroupByB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + builder1.groupBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.limit(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.limit(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL.LimitFinisher builder3 = builder2.limit(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.offset(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.offset(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL.OffsetFirstFinisher builder3 = builder2.offset(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.fetchFirst(2).rowsOnly(); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.fetchFirst(2).rowsOnly(); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL.RowsOnlyFinisher builder3 = builder2.fetchFirst(2).rowsOnly(); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.orderBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.orderBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + builder3.offset(2); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + builder3.offset(2); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + builder3.offset(2); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(2); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } +} diff --git a/src/test/java/issues/gh100/FromJoinWhereTest.java b/src/test/java/issues/gh100/FromJoinWhereTest.java new file mode 100644 index 000000000..a2b30cde6 --- /dev/null +++ b/src/test/java/issues/gh100/FromJoinWhereTest.java @@ -0,0 +1,3930 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import org.junit.jupiter.api.Test; +import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.QueryExpressionDSL; +import org.mybatis.dynamic.sql.select.SelectDSL; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; + +public class FromJoinWhereTest { + + @Test + public void testNormalUsage() { + SelectStatementProvider selectStatement = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3) + .offset(2) + .build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFrom() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testfromJoinWhereB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testfromJoinWhereB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testfromJoinWhereB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionUnionB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionUnionB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionUnionB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionUnionB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionUnionB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder5 = builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB7() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + SelectDSL.OffsetFinisher builder7 = builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder7.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB7() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + SelectDSL.RowsOnlyFinisher builder7 = builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder7.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.RowsOnlyFinisher builder6 = builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + SelectDSL.OffsetFinisher builder6 = builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + SelectDSL.RowsOnlyFinisher builder6 = builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.RowsOnlyFinisher builder5 = builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + SelectDSL.OffsetFinisher builder6 = builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + SelectDSL.RowsOnlyFinisher builder6 = builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.RowsOnlyFinisher builder5 = builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.limit(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.limit(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.limit(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + SelectDSL.OffsetFinisher builder5 = builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOffsetFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOffsetFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOffsetFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOffsetFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOffsetFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + SelectDSL.RowsOnlyFinisher builder5 = builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.RowsOnlyFinisher builder4 = builder3.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } +} diff --git a/src/test/java/issues/gh100/Issue100Test.java b/src/test/java/issues/gh100/Issue100Test.java new file mode 100644 index 000000000..96cf55113 --- /dev/null +++ b/src/test/java/issues/gh100/Issue100Test.java @@ -0,0 +1,241 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import org.junit.jupiter.api.Test; +import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.QueryExpressionDSL; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; + +public class Issue100Test { + + @Test + public void testNormalUsage() { + SelectStatementProvider selectStatement = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3) + .offset(2) + .build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild01() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild02() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild03() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild04() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild05() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3) + .offset(2); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild06() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .offset(2); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild07() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .offset(2) + .fetchFirst(3).rowsOnly(); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild08() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .fetchFirst(3).rowsOnly(); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void test3() { + QueryExpressionDSL.JoinSpecificationFinisher on = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + on.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectStatementProvider selectStatement = on + .build() + .render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()) + .isEqualTo("select student.id, student.name, student.idcard from student join student_reg on student.id = student_reg.studentId where student.idcard = #{parameters.p1}"); + } +} diff --git a/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java b/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java new file mode 100644 index 000000000..7f613e35e --- /dev/null +++ b/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java @@ -0,0 +1,178 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import org.junit.jupiter.api.Test; +import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.QueryExpressionDSL; +import org.mybatis.dynamic.sql.select.SelectDSL; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; + +public class Issue100TestStartAfterJoin { + + @Test + public void testSuccessiveBuild02() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild03() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + SelectDSL selectModel = builder.orderBy(StudentDynamicSqlSupport.id); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " order by id"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + selectStatement = selectModel.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild04() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.limit(3); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " limit #{parameters._limit}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild05() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3) + .offset(2); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild06() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .offset(2); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild07() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .offset(2) + .fetchFirst(3).rowsOnly(); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild08() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .fetchFirst(3).rowsOnly(); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } +} diff --git a/src/test/java/issues/gh100/README.md b/src/test/java/issues/gh100/README.md new file mode 100644 index 000000000..80732bbcf --- /dev/null +++ b/src/test/java/issues/gh100/README.md @@ -0,0 +1,5 @@ +# About these Tests + +GitHub issues 100 and 102 exposed issues where calling the `build()` method at an unexpected location caused the rendered SQL to be incorrect. Changes for this issue now allow for the `build()` method to be called on any intermediate object in the select statement chain * regardless if further operations have been performed * and consistent renderings will occur. + +Tests in this directory cover many of the possible places where a `build()` method could be called and many of the possible paths through a select statement. diff --git a/src/test/java/issues/gh100/StudentDynamicSqlSupport.java b/src/test/java/issues/gh100/StudentDynamicSqlSupport.java new file mode 100644 index 000000000..294fab0e3 --- /dev/null +++ b/src/test/java/issues/gh100/StudentDynamicSqlSupport.java @@ -0,0 +1,36 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import org.mybatis.dynamic.sql.SqlColumn; +import org.mybatis.dynamic.sql.SqlTable; + +public class StudentDynamicSqlSupport { + public static final Student student = new Student(); + public static final SqlColumn id = student.id; + public static final SqlColumn name = student.name; + public static final SqlColumn idcard = student.idcard; + + public static final class Student extends SqlTable { + public final SqlColumn id = column("id"); + public final SqlColumn name = column("name"); + public final SqlColumn idcard = column("idcard"); + + public Student() { + super("student"); + } + } +} diff --git a/src/test/java/issues/gh100/StudentRegDynamicSqlSupport.java b/src/test/java/issues/gh100/StudentRegDynamicSqlSupport.java new file mode 100644 index 000000000..af3b69c39 --- /dev/null +++ b/src/test/java/issues/gh100/StudentRegDynamicSqlSupport.java @@ -0,0 +1,36 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import org.mybatis.dynamic.sql.SqlColumn; +import org.mybatis.dynamic.sql.SqlTable; + +public class StudentRegDynamicSqlSupport { + public static final StudentReg studentReg = new StudentReg(); + public static final SqlColumn studentid = studentReg.studentid; + public static final SqlColumn examnumber = studentReg.examnumber; + public static final SqlColumn regcode = studentReg.regcode; + + public static final class StudentReg extends SqlTable { + public final SqlColumn studentid = column("studentId"); + public final SqlColumn examnumber = column("examnumber"); + public final SqlColumn regcode = column("regcode"); + + public StudentReg() { + super("student_reg"); + } + } +}