From e6c896f14a710ab408ad7b15f09d20498717bdfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Thu, 25 May 2023 11:35:06 +0800 Subject: [PATCH] add convert method; close #I781LP --- .../mybatisflex/core/query/QueryMethods.java | 9 +- .../core/query/StringFunctionQueryColumn.java | 83 +++++++++++++++++++ .../coretest/AccountSqlTester.java | 16 ++++ 3 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 mybatis-flex-core/src/main/java/com/mybatisflex/core/query/StringFunctionQueryColumn.java diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java index 06d5541f..a4d1e81e 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryMethods.java @@ -65,6 +65,11 @@ public class QueryMethods { return new DistinctQueryColumn(columns); } + //CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) + public static StringFunctionQueryColumn convert(String... params) { + return new StringFunctionQueryColumn("CONVERT", params); + } + public static StringQueryColumn column(String column) { return new StringQueryColumn(column); } @@ -85,7 +90,7 @@ public class QueryMethods { return new OperatorQueryCondition(" NOT ", childCondition); } - public static QueryCondition noCondition(){ + public static QueryCondition noCondition() { return QueryCondition.createEmpty(); } @@ -110,7 +115,7 @@ public class QueryMethods { return select(count("1")); } - public static RawValue raw(String raw){ + public static RawValue raw(String raw) { return new RawValue(raw); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/StringFunctionQueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/StringFunctionQueryColumn.java new file mode 100644 index 00000000..8fb5cbd6 --- /dev/null +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/StringFunctionQueryColumn.java @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * 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 com.mybatisflex.core.query; + +import com.mybatisflex.core.dialect.IDialect; +import com.mybatisflex.core.util.SqlUtil; +import com.mybatisflex.core.util.StringUtil; + +import java.util.Arrays; +import java.util.List; + +/** + * 数据库 聚合函数,例如 CONVERT(NVARCHAR(30), GETDATE(), 126) 等等 + */ +public class StringFunctionQueryColumn extends QueryColumn { + + protected String fnName; + protected List params; + + public StringFunctionQueryColumn(String fnName, String ...params) { + SqlUtil.keepColumnSafely(fnName); + this.fnName = fnName; + this.params = Arrays.asList(params); + } + + + public String getFnName() { + return fnName; + } + + public void setFnName(String fnName) { + this.fnName = fnName; + } + + + public List getParams() { + return params; + } + + public void setParams(List params) { + this.params = params; + } + + @Override + public String toSelectSql(List queryTables, IDialect dialect) { + String sql = StringUtil.join(", ",params); + return StringUtil.isBlank(sql) ? "" : fnName + "(" + sql + ")" + WrapperUtil.buildAsAlias(alias); + } + + @Override + String toConditionSql(List queryTables, IDialect dialect) { + String sql = StringUtil.join(", ",params); + return StringUtil.isBlank(sql) ? "" : fnName + "(" + sql + ")"; + } + + @Override + public QueryColumn as(String alias) { + SqlUtil.keepColumnSafely(alias); + this.alias = alias; + return this; + } + + @Override + public String toString() { + return "StringFunctionQueryColumn{" + + "fnName='" + fnName + '\'' + + ", params=" + params + + '}'; + } +} diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java index 4f6a5256..45e2fde4 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java @@ -306,6 +306,22 @@ public class AccountSqlTester { System.out.println(sql); } + @Test + public void testConvert() { + IDialect dialect = new CommonsDialectImpl(); + + QueryWrapper queryWrapper = QueryWrapper.create() + .select(ACCOUNT.ALL_COLUMNS, convert("NVARCHAR(30)", "GETDATE()", "126").as("result")) + .from(ACCOUNT) + .and(ACCOUNT.USER_NAME.like("michael")) + .and(convert("NVARCHAR(30)", "GETDATE()", "126").in( + select(ACCOUNT.ID).from(ACCOUNT).where(ACCOUNT.ID.ge(100))) + ); + + String sql = dialect.forSelectByQuery(queryWrapper); + System.out.println(sql); + } + @Test public void testLimitOffset() {