diff --git a/CHANGELOG.md b/CHANGELOG.md index 3323eafdb..9f3da4db9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,25 @@ This log will detail notable changes to MyBatis Dynamic SQL. Full details are av ## Release 2.0.0 - Unreleased -Significant changes: +Release 2.0.0 is a significant milestone for the library. We have moved to Java 17 as the minimum version supported. If +you are unable to move to this version of Java then the releases in the 1.x line can be used with Java 8. + +In addition, we have taken the opportunity to make changes to the library that may break existing code. We have +worked to make these changes as minimal as possible. + +**Potentially Breaking Changes:** + +- If you have implemented any custom functions, you will likely need to make changes. The supplied base classes now + hold an instance of `BasicColumn` rather than `BindableColumn`. This change was made to make the functions more + useful in variety of circumstances. If you follow the patterns shown on the + [Extending the Library](https://mybatis.org/mybatis-dynamic-sql/docs/extending.html) page, the change should be + limited to changing the private constructor to accept `BasicColumn` rather than `BindableColumn`. + +Other important changes: - The library now requires Java 17 - Deprecated code from prior releases is removed -- Allow CASE expressions in ORDER BY Clauses +- We now allow CASE expressions in ORDER BY Clauses ## Release 1.5.2 - June 3, 2024 diff --git a/pom.xml b/pom.xml index 94348cd05..ff30de791 100644 --- a/pom.xml +++ b/pom.xml @@ -68,7 +68,9 @@ org.mybatis.dynamic.sql 2.0.10 - 1.8 + 17 + 2.0 + 2.0 pom.xml,src/main/java,src/main/kotlin src/test/java,src/test/kotlin diff --git a/src/main/java/org/mybatis/dynamic/sql/BasicColumn.java b/src/main/java/org/mybatis/dynamic/sql/BasicColumn.java index b73757a71..a583ba4ff 100644 --- a/src/main/java/org/mybatis/dynamic/sql/BasicColumn.java +++ b/src/main/java/org/mybatis/dynamic/sql/BasicColumn.java @@ -15,9 +15,11 @@ */ package org.mybatis.dynamic.sql; +import java.sql.JDBCType; import java.util.Optional; import org.mybatis.dynamic.sql.render.RenderingContext; +import org.mybatis.dynamic.sql.render.RenderingStrategy; import org.mybatis.dynamic.sql.util.FragmentAndParameters; /** @@ -58,6 +60,18 @@ public interface BasicColumn { */ FragmentAndParameters render(RenderingContext renderingContext); + default Optional jdbcType() { + return Optional.empty(); + } + + default Optional typeHandler() { + return Optional.empty(); + } + + default Optional renderingStrategy() { + return Optional.empty(); + } + /** * Utility method to make it easier to build column lists for methods that require an * array rather than the varargs method. diff --git a/src/main/java/org/mybatis/dynamic/sql/BindableColumn.java b/src/main/java/org/mybatis/dynamic/sql/BindableColumn.java index 274b52e25..77e6e5bc1 100644 --- a/src/main/java/org/mybatis/dynamic/sql/BindableColumn.java +++ b/src/main/java/org/mybatis/dynamic/sql/BindableColumn.java @@ -15,14 +15,11 @@ */ package org.mybatis.dynamic.sql; -import java.sql.JDBCType; import java.util.Optional; -import org.mybatis.dynamic.sql.render.RenderingStrategy; - /** - * Describes additional attributes of columns that are necessary for binding the column as a JDBC parameter. - * Columns in where clauses are typically bound. + * Describes a column with a known data type. The type is only used by the compiler to assure type safety + * when building clauses with conditions. * * @author Jeff Butler * @@ -37,18 +34,6 @@ public interface BindableColumn extends BasicColumn { @Override BindableColumn as(String alias); - default Optional jdbcType() { - return Optional.empty(); - } - - default Optional typeHandler() { - return Optional.empty(); - } - - default Optional renderingStrategy() { - return Optional.empty(); - } - default Object convertParameterType(T value) { return value; } diff --git a/src/main/java/org/mybatis/dynamic/sql/SqlBuilder.java b/src/main/java/org/mybatis/dynamic/sql/SqlBuilder.java index 6516696f6..df4292653 100644 --- a/src/main/java/org/mybatis/dynamic/sql/SqlBuilder.java +++ b/src/main/java/org/mybatis/dynamic/sql/SqlBuilder.java @@ -497,6 +497,10 @@ static Sum sum(BindableColumn column) { return Sum.of(column); } + static Sum sum(BasicColumn column) { + return Sum.of(column); + } + static Sum sum(BindableColumn column, VisitableCondition condition) { return Sum.of(column, condition); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Avg.java b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Avg.java index 5130abf7c..6fcb1f3b5 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Avg.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Avg.java @@ -15,6 +15,7 @@ */ package org.mybatis.dynamic.sql.select.aggregate; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction; @@ -22,7 +23,7 @@ public class Avg extends AbstractUniTypeFunction> { - private Avg(BindableColumn column) { + private Avg(BasicColumn column) { super(column); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Max.java b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Max.java index f44225f12..2e3e0fec0 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Max.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Max.java @@ -15,6 +15,7 @@ */ package org.mybatis.dynamic.sql.select.aggregate; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction; @@ -22,7 +23,7 @@ public class Max extends AbstractUniTypeFunction> { - private Max(BindableColumn column) { + private Max(BasicColumn column) { super(column); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Min.java b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Min.java index 02830335c..b376d00a2 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Min.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Min.java @@ -15,6 +15,7 @@ */ package org.mybatis.dynamic.sql.select.aggregate; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction; @@ -22,7 +23,7 @@ public class Min extends AbstractUniTypeFunction> { - private Min(BindableColumn column) { + private Min(BasicColumn column) { super(column); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java index 02c8c7a42..e86a0d5b4 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/aggregate/Sum.java @@ -17,6 +17,7 @@ import java.util.function.Function; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.VisitableCondition; import org.mybatis.dynamic.sql.render.RenderingContext; @@ -28,7 +29,7 @@ public class Sum extends AbstractUniTypeFunction> { private final Function renderer; - private Sum(BindableColumn column) { + private Sum(BasicColumn column) { super(column); renderer = rc -> column.render(rc).mapFragment(this::applyAggregate); } @@ -48,7 +49,7 @@ private Sum(BindableColumn column, VisitableCondition condition) { }; } - private Sum(BindableColumn column, Function renderer) { + private Sum(BasicColumn column, Function renderer) { super(column); this.renderer = renderer; } @@ -71,6 +72,10 @@ public static Sum of(BindableColumn column) { return new Sum<>(column); } + public static Sum of(BasicColumn column) { + return new Sum<>(column); + } + public static Sum of(BindableColumn column, VisitableCondition condition) { return new Sum<>(column, condition); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/AbstractTypeConvertingFunction.java b/src/main/java/org/mybatis/dynamic/sql/select/function/AbstractTypeConvertingFunction.java index cab8aff39..98e019fa7 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/AbstractTypeConvertingFunction.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/AbstractTypeConvertingFunction.java @@ -18,6 +18,7 @@ import java.util.Objects; import java.util.Optional; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; /** @@ -36,10 +37,10 @@ */ public abstract class AbstractTypeConvertingFunction> implements BindableColumn { - protected final BindableColumn column; + protected final BasicColumn column; protected String alias; - protected AbstractTypeConvertingFunction(BindableColumn column) { + protected AbstractTypeConvertingFunction(BasicColumn column) { this.column = Objects.requireNonNull(column); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/AbstractUniTypeFunction.java b/src/main/java/org/mybatis/dynamic/sql/select/function/AbstractUniTypeFunction.java index 7a0690bae..6e59885cb 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/AbstractUniTypeFunction.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/AbstractUniTypeFunction.java @@ -18,7 +18,7 @@ import java.sql.JDBCType; import java.util.Optional; -import org.mybatis.dynamic.sql.BindableColumn; +import org.mybatis.dynamic.sql.BasicColumn; /** * Represents a function that does not change the underlying data type. @@ -33,7 +33,7 @@ public abstract class AbstractUniTypeFunction> extends AbstractTypeConvertingFunction { - protected AbstractUniTypeFunction(BindableColumn column) { + protected AbstractUniTypeFunction(BasicColumn column) { super(column); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/Add.java b/src/main/java/org/mybatis/dynamic/sql/select/function/Add.java index fe0661bea..533f5cc15 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/Add.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/Add.java @@ -23,7 +23,7 @@ public class Add extends OperatorFunction { - private Add(BindableColumn firstColumn, BasicColumn secondColumn, + private Add(BasicColumn firstColumn, BasicColumn secondColumn, List subsequentColumns) { super("+", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$ } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/Concat.java b/src/main/java/org/mybatis/dynamic/sql/select/function/Concat.java index e633b2953..ec1c7f93e 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/Concat.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/Concat.java @@ -29,7 +29,7 @@ public class Concat extends AbstractUniTypeFunction> { private final List allColumns = new ArrayList<>(); - protected Concat(BindableColumn firstColumn, List subsequentColumns) { + protected Concat(BasicColumn firstColumn, List subsequentColumns) { super(firstColumn); allColumns.add(firstColumn); this.allColumns.addAll(subsequentColumns); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/Concatenate.java b/src/main/java/org/mybatis/dynamic/sql/select/function/Concatenate.java index 3179f2a1d..fa16f4a43 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/Concatenate.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/Concatenate.java @@ -23,7 +23,7 @@ public class Concatenate extends OperatorFunction { - protected Concatenate(BindableColumn firstColumn, BasicColumn secondColumn, + protected Concatenate(BasicColumn firstColumn, BasicColumn secondColumn, List subsequentColumns) { super("||", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$ } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/Divide.java b/src/main/java/org/mybatis/dynamic/sql/select/function/Divide.java index 24d2832ca..76d804707 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/Divide.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/Divide.java @@ -23,7 +23,7 @@ public class Divide extends OperatorFunction { - private Divide(BindableColumn firstColumn, BasicColumn secondColumn, + private Divide(BasicColumn firstColumn, BasicColumn secondColumn, List subsequentColumns) { super("/", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$ } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/Lower.java b/src/main/java/org/mybatis/dynamic/sql/select/function/Lower.java index e59d04712..6bed396c0 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/Lower.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/Lower.java @@ -15,13 +15,14 @@ */ package org.mybatis.dynamic.sql.select.function; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.util.FragmentAndParameters; public class Lower extends AbstractUniTypeFunction> { - private Lower(BindableColumn column) { + private Lower(BasicColumn column) { super(column); } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/Multiply.java b/src/main/java/org/mybatis/dynamic/sql/select/function/Multiply.java index 50d38b966..de359e09c 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/Multiply.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/Multiply.java @@ -23,7 +23,7 @@ public class Multiply extends OperatorFunction { - private Multiply(BindableColumn firstColumn, BasicColumn secondColumn, + private Multiply(BasicColumn firstColumn, BasicColumn secondColumn, List subsequentColumns) { super("*", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$ } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/OperatorFunction.java b/src/main/java/org/mybatis/dynamic/sql/select/function/OperatorFunction.java index 7ce5c5c25..7c9a89316 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/OperatorFunction.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/OperatorFunction.java @@ -35,7 +35,7 @@ public class OperatorFunction extends AbstractUniTypeFunction subsequentColumns = new ArrayList<>(); private final String operator; - protected OperatorFunction(String operator, BindableColumn firstColumn, BasicColumn secondColumn, + protected OperatorFunction(String operator, BasicColumn firstColumn, BasicColumn secondColumn, List subsequentColumns) { super(firstColumn); this.secondColumn = Objects.requireNonNull(secondColumn); @@ -52,9 +52,7 @@ protected OperatorFunction copy() { public FragmentAndParameters render(RenderingContext renderingContext) { String paddedOperator = " " + operator + " "; //$NON-NLS-1$ //$NON-NLS-2$ - // note - the cast below is added for type inference issues in some compilers - return Stream.of(Stream.of((BasicColumn) column), - Stream.of(secondColumn), subsequentColumns.stream()) + return Stream.of(Stream.of(column, secondColumn), subsequentColumns.stream()) .flatMap(Function.identity()) .map(column -> column.render(renderingContext)) .collect(FragmentCollector.collect()) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/Substring.java b/src/main/java/org/mybatis/dynamic/sql/select/function/Substring.java index 81b95ea5c..d49263977 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/Substring.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/Substring.java @@ -15,6 +15,7 @@ */ package org.mybatis.dynamic.sql.select.function; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.util.FragmentAndParameters; @@ -24,7 +25,7 @@ public class Substring extends AbstractUniTypeFunction> { private final int offset; private final int length; - private Substring(BindableColumn column, int offset, int length) { + private Substring(BasicColumn column, int offset, int length) { super(column); this.offset = offset; this.length = length; diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/Subtract.java b/src/main/java/org/mybatis/dynamic/sql/select/function/Subtract.java index 94e7e3c81..8f011e902 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/Subtract.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/Subtract.java @@ -23,7 +23,7 @@ public class Subtract extends OperatorFunction { - private Subtract(BindableColumn firstColumn, BasicColumn secondColumn, + private Subtract(BasicColumn firstColumn, BasicColumn secondColumn, List subsequentColumns) { super("-", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$ } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/function/Upper.java b/src/main/java/org/mybatis/dynamic/sql/select/function/Upper.java index 2891032df..a62e5d655 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/function/Upper.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/function/Upper.java @@ -15,13 +15,14 @@ */ package org.mybatis.dynamic.sql.select.function; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.util.FragmentAndParameters; public class Upper extends AbstractUniTypeFunction> { - private Upper(BindableColumn column) { + private Upper(BasicColumn column) { super(column); } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlElements.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlElements.kt index 2d9f1e8a1..8a249279a 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlElements.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlElements.kt @@ -137,6 +137,8 @@ fun avg(column: BindableColumn): Avg = SqlBuilder.avg(column) fun sum(column: BindableColumn): Sum = SqlBuilder.sum(column) +fun sum(column: BasicColumn): Sum<*> = SqlBuilder.sum(column) + fun sum(column: BindableColumn, condition: VisitableCondition): Sum = SqlBuilder.sum(column, condition) // constants diff --git a/src/site/markdown/docs/extending.md b/src/site/markdown/docs/extending.md index ae04f434a..a32dea137 100644 --- a/src/site/markdown/docs/extending.md +++ b/src/site/markdown/docs/extending.md @@ -11,10 +11,10 @@ The SELECT support is the most complex part of the library, and also the part of extended. There are two main interfaces involved with extending the SELECT support. Picking which interface to implement is dependent on how you want to use your extension. -| Interface | Purpose | -|------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------| -| `org.mybatis.dynamic.sql.BasicColumn` | Use this interface if you want to add capabilities to a SELECT list or a GROUP BY expression. For example, using a database function. | -| `org.mybatis.dynamic.sql.BindableColumn` | Use this interface if you want to add capabilities to a WHERE clause. For example, creating a custom condition. | +| Interface | Purpose | +|------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `org.mybatis.dynamic.sql.BasicColumn` | Use this interface if you want to add capabilities to a SELECT list, a GROUP BY, or an ORDER BY expression. For example, using a database function. | +| `org.mybatis.dynamic.sql.BindableColumn` | Use this interface if you want to add capabilities to a WHERE clause in addition to the capabilities of `BasicColumn`. For example, creating a custom condition. | Rendering is the process of generating an appropriate SQL fragment to implement the function or calculated column. The library will call a method `render(RenderingContext)` in your implementation. This method should return an @@ -101,6 +101,7 @@ the function changes the data type from `byte[]` to `String`. import java.sql.JDBCType; import java.util.Optional; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractTypeConvertingFunction; @@ -108,7 +109,7 @@ import org.mybatis.dynamic.sql.util.FragmentAndParameters; public class ToBase64 extends AbstractTypeConvertingFunction { - protected ToBase64(BindableColumn column) { + private ToBase64(BasicColumn column) { super(column); } @@ -143,13 +144,15 @@ public class ToBase64 extends AbstractTypeConvertingFunction { - private Upper(BindableColumn column) { + private Upper(BasicColumn column) { super(column); } @@ -178,19 +181,21 @@ Note that `FragmentAndParameters` has a utility method that can simplify the imp add any new parameters to the resulting fragment. For example, the UPPER function can be simplified as follows: ```java +import org.mybatis.dynamic.sql.BasicColumn; +import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction; import org.mybatis.dynamic.sql.util.FragmentAndParameters; public class Upper extends AbstractUniTypeFunction { - private Upper(BindableColumn column) { + private Upper(BasicColumn column) { super(column); } @Override public FragmentAndParameters render(RenderingContext renderingContext) { - return = column.render(renderingContext).mapFragment(f -> "upper(" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ + return column.render(renderingContext).mapFragment(f -> "upper(" + f + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } @Override @@ -211,9 +216,16 @@ The following function implements the concatenate operator. Note that the operat arbitrary length: ```java +import java.util.Arrays; +import java.util.List; + +import org.mybatis.dynamic.sql.BasicColumn; +import org.mybatis.dynamic.sql.BindableColumn; +import org.mybatis.dynamic.sql.select.function.OperatorFunction; + public class Concatenate extends OperatorFunction { - protected Concatenate(BindableColumn firstColumn, BasicColumn secondColumn, + protected Concatenate(BasicColumn firstColumn, BasicColumn secondColumn, List subsequentColumns) { super("||", firstColumn, secondColumn, subsequentColumns); //$NON-NLS-1$ } diff --git a/src/test/java/examples/animal/data/Length.java b/src/test/java/examples/animal/data/Length.java index cf779c15e..6fb90e40d 100644 --- a/src/test/java/examples/animal/data/Length.java +++ b/src/test/java/examples/animal/data/Length.java @@ -18,13 +18,14 @@ import java.sql.JDBCType; import java.util.Optional; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractTypeConvertingFunction; import org.mybatis.dynamic.sql.util.FragmentAndParameters; public class Length extends AbstractTypeConvertingFunction { - private Length(BindableColumn column) { + private Length(BasicColumn column) { super(column); } @@ -48,8 +49,6 @@ protected Length copy() { } public static Length length(BindableColumn column) { - @SuppressWarnings("unchecked") - BindableColumn c = (BindableColumn) column; - return new Length(c); + return new Length(column); } } diff --git a/src/test/java/examples/type_conversion/ToBase64.java b/src/test/java/examples/type_conversion/ToBase64.java index 97d8ad097..ce5ab5891 100644 --- a/src/test/java/examples/type_conversion/ToBase64.java +++ b/src/test/java/examples/type_conversion/ToBase64.java @@ -18,6 +18,7 @@ import java.sql.JDBCType; import java.util.Optional; +import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; import org.mybatis.dynamic.sql.render.RenderingContext; import org.mybatis.dynamic.sql.select.function.AbstractTypeConvertingFunction; @@ -25,7 +26,7 @@ public class ToBase64 extends AbstractTypeConvertingFunction { - protected ToBase64(BindableColumn column) { + protected ToBase64(BasicColumn column) { super(column); } diff --git a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt index 5dc24ede2..75a703c09 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt @@ -35,13 +35,18 @@ import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.TestInstance.Lifecycle import org.mybatis.dynamic.sql.exception.NonRenderingWhereClauseException import org.mybatis.dynamic.sql.util.kotlin.elements.add +import org.mybatis.dynamic.sql.util.kotlin.elements.case +import org.mybatis.dynamic.sql.util.kotlin.elements.concat import org.mybatis.dynamic.sql.util.kotlin.elements.constant import org.mybatis.dynamic.sql.util.kotlin.elements.isIn import org.mybatis.dynamic.sql.util.kotlin.elements.sortColumn +import org.mybatis.dynamic.sql.util.kotlin.elements.stringConstant +import org.mybatis.dynamic.sql.util.kotlin.elements.sum import org.mybatis.dynamic.sql.util.kotlin.mybatis3.insertInto import org.mybatis.dynamic.sql.util.kotlin.mybatis3.insertSelect import org.mybatis.dynamic.sql.util.kotlin.mybatis3.multiSelect import org.mybatis.dynamic.sql.util.kotlin.mybatis3.select +import org.mybatis.dynamic.sql.util.mybatis3.CommonSelectMapper import java.util.* @TestInstance(Lifecycle.PER_CLASS) @@ -55,6 +60,7 @@ class PersonMapperTest { withMapper(PersonMapper::class) withMapper(PersonWithAddressMapper::class) withMapper(AddressMapper::class) + withMapper(CommonSelectMapper::class) withTypeHandler(YesNoTypeHandler::class) } } @@ -917,4 +923,49 @@ class PersonMapperTest { "where id in ()" assertThat(selectStatement.selectStatement).isEqualTo(expected) } + + @Test + fun testSumWithCase() { + sqlSessionFactory.openSession().use { session -> + val mapper = session.getMapper(CommonSelectMapper::class.java) + + val selectStatement = select(id, sum(case { + `when` { + id isEqualTo 1 + then(101) + } + `else`(999) + }).`as`("fred")) { + from(person) + groupBy(id) + } + + val expected = + "select id, sum(case when id = #{parameters.p1,jdbcType=INTEGER} then 101 else 999 end) as fred from Person group by id" + assertThat(selectStatement.selectStatement).isEqualTo(expected) + + val rows = mapper.selectManyMappedRows(selectStatement) + assertThat(rows).hasSize(6) + } + } + + @Test + fun testConcat() { + sqlSessionFactory.openSession().use { session -> + val mapper = session.getMapper(CommonSelectMapper::class.java) + + val selectStatement = select(id, concat(firstName, stringConstant(" "), lastName).`as`("fullname")) { + from(person) + where { concat(firstName, stringConstant(" "), lastName) isEqualTo "Fred Flintstone" } + } + + val expected = + "select id, concat(first_name, ' ', last_name) as fullname from Person " + + "where concat(first_name, ' ', last_name) = #{parameters.p1,jdbcType=VARCHAR}" + assertThat(selectStatement.selectStatement).isEqualTo(expected) + + val rows = mapper.selectManyMappedRows(selectStatement) + assertThat(rows).hasSize(1) + } + } }